将一组结构对象写入文件&阅读它

时间:2015-09-16 01:32:34

标签: c structure file-handling

我创建了一个结构和对象的对象数组。我想将其保存为二进制文件。然后我再次阅读该文件&填充结构,但是我将所有值都设为空。

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;
}

1 个答案:

答案 0 :(得分:4)

当您致电fseek(F,0,SEEK_END);时,您正在将位置指示器移动到文件的末尾。在调用fread()之前(在调用ftell()来获取大小之后),您需要移回文件的开头,因为它从指标的当前位置读取。

您可以使用fseek(F,0,SEEK_SET);rewind(F);执行此操作 - 它们具有相同的效果。

如果你检查了fread()的返回值,你会很快注意到这一点,因为它返回成功读取的字节数。 feof()ferror()也很重要。