在C语言中将结构体写入文件

40

能否将整个结构体写入文件中?

例如:

struct date {
    char day[80];
    int month;
    int year;
};

13
是的 - Mitch Wheat
1
请阅读以下内容:如何在C语言中将结构体写入文件 - Grijesh Chauhan
1个回答

46

有没有可能将整个结构体写入文件?

  1. 您可以使用fwrite函数来实现这一点。
  2. 必须在第一个参数中传递引用。
  3. 在第二个参数中传递每个对象的sizeof
  4. 在第三个参数中传递要写入的对象数。
  5. 在第四个参数中传递文件指针。
  6. 不要忘记以二进制模式打开文件。
  7. 您可以使用fread函数从文件中读取对象。
  8. 在小端系统中读/写并在大端系统中读/写时,注意字节序问题,反之亦然。请阅读如何编写与字节序无关的C/C++代码

struct date *object=malloc(sizeof(struct date));
strcpy(object->day,"Good day");
object->month=6;
object->year=2013;
FILE * file= fopen("output", "wb");
if (file != NULL) {
    fwrite(object, sizeof(struct date), 1, file);
    fclose(file);
}

您可以使用fread以相同的方式阅读它们。

    struct date *object2=malloc(sizeof(struct date));
    FILE * file= fopen("output", "rb");
    if (file != NULL) {
        fread(object2, sizeof(struct date), 1, file);
        fclose(file);
    }
    printf("%s/%d/%d\n",object2->day,object2->month,object2->year);

5
他还应该小心结构体填充,至少要注意。 - Giorgi Moniava
我还在文件中编写了一些C对象,并希望读取它们并进行处理。但是,我不知道哪些对象已经写入文件,可能是任何一个,因此,在fread中,我将不知道正在读取的对象的sizeof()。另外,如何一次仅读取一个对象? fread如何知道表示对象边界的文件中字节的起始和结束位置? - Abhishek Sagar
1
我猜,如果是这种情况,文件应该有一个结构,例如,假设您在一行中编写类型,在另一行中编写对象等,然后根据类型,从程序中可以得知大小。 - pinkpanther
还有一个问题:你如何从那个文件中读取所有的结构体?一直读到文件末尾,因为我尝试了很多种方法,但总是出现“分段错误”或其他错误,而我没有找到这种情况。到处都只是读取字符到结尾,而不是读取结构体。 - gabor aron
3
写入的文件不是用文本编辑器来阅读的,因为它是对象序列化后的形式。如果你想要读取它,你需要编写一个 C 程序来读取它。你需要寻找文件结尾,可以查看 fread 的输出结果。参考这里:https://msdn.microsoft.com/en-us/library/kt0etdcs.aspx。通常情况下,如果 fread 输出结果是正数,则表示有数据被读取了。 - pinkpanther
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接