我试着在文件中打印一个结构体的内容里面有一个动态数组我觉得我没有得到
结构体看起来像
struct save {
char s_ext[5];
char *s_bits;
long s_frec[256];
long int s_sim;
};
这里我将信息保存在结构体
中struct save *res = malloc(sizeof(struct save));
我尝试在struct中malloc数组s_bits
res->s_bits = malloc(sizeof(char) * sim);
if (res->s_bits == NULL) {
printf("errorn");
}
strcpy(res->s_bits, textDeco);
strcpy(res->s_ext, extension);
res->s_sim = sim;
for (i = 0; i < 15; ++i) {
printf("%ld -> %d:%d, ", i, res->s_bits[i], textDeco[i]);
}
printf("n");
for (i = 0; i < 256; ++i) {
res->s_frec[i] = frecCopy[i];
}
打开文件
FILE *save_struct = fopen("codi.dat", "w");
当我尝试使用fwrite
将结构体写入二进制文件时
if (fwrite(res, sizeof(struct save), 1, save_struct) != 0) {
printf("file created!n");
} else {
printf("errorn");
}
它不写s_bits的元素,这是我不想要的。
如何获得带有read的元素?
你像这样分配你的结构体:
struct save *res = malloc(sizeof(struct *res));
if(!res) // handle errror
res->s_bits = malloc(sim);
if(!res->s_bits) // handle error
当您使用fwrite()
将结构体存储到文件中时,它将保存指针值res->s_bits,而不是它所指向的数组。处理这个问题的方法是单独写出每个字段。当这变得很烦人时,找一个库来帮助你序列化数据(Cap'n Proto, protobuf, JSON等)。你也应该考虑SQLite。
当你只有一个这样的字段时,你可以使s_bits
成为一个灵活的数组成员:
struct save {
char s_ext[5];
long s_frec[256];
long int s_sim;
char s_bits[];
};
现在你像这样分配它:
struct save *res = malloc(sizeof(struct *res) + sim);
,你可以用类似的方式写:
fwrite(res, sizeof(*res) + res->s_sim, 1, save_struct)