我创建了一个结构和对象的对象数组。我想将其保存为二进制文件。然后我再次阅读该文件&填充结构,但是我将所有值都设为空。
typedef struct {
int a;
long b;
}test;
int main(void) {
test *o1;
test *o2;
int no_of_obj = 3,i;
o1 = malloc(no_of_obj * sizeof(test));
printf("fsdfsdf");
o1[0].a = 11;
o1[0].b = 12;
o1[1].a = 21;
o1[1].b = 22;
o1[2].a = 31;
o1[2].b = 32;
for(i=0;i<no_of_obj;i++) {
printf("%d %lu\n",o1[i].a,o1[i].b);
}
FILE *F = fopen("test.db","wb");
for(i=0;i<no_of_obj;i++) {
fwrite(&o1[i],sizeof(test),1,F);
}
fclose(F);
printf("dfsdfds");
F = fopen("test.db","rb");
if(!F) {
printf("no file!");
return 0;
}
fseek(F,0,SEEK_END);
int size = ftell(F);
int total_objects = size/sizeof(test);
o2 = malloc(sizeof(test) * total_objects);
for(i=0;i<total_objects;i++) {
fread(&o2[i],sizeof(test),1,F);
}
for(i=0;i<total_objects;i++) {
printf("%d %lu\n",o2[i].a,o2[i].b);
}
return 0;
}
答案 0 :(得分:4)
当您致电fseek(F,0,SEEK_END);
时,您正在将位置指示器移动到文件的末尾。在调用fread()
之前(在调用ftell()
来获取大小之后),您需要移回文件的开头,因为它从指标的当前位置读取。
您可以使用fseek(F,0,SEEK_SET);
或rewind(F);
执行此操作 - 它们具有相同的效果。
如果你检查了fread()
的返回值,你会很快注意到这一点,因为它返回成功读取的字节数。 feof()
和ferror()
也很重要。