将多个结构保存到二进制文件中(C)

时间:2016-03-05 18:35:13

标签: c function file-io struct

我正在写一个函数,它应该在二进制文件中保存3个结构(其中2个是结构数组)。这是我的功能:

void saveFile(Struct1 *s1, Struct2 *s2, Struct3 s3) {
    FILE *fp = NULL;
    fp = fopen("save.bin", "w+b");

    if (fp == NULL) {
        printf("Save failed.\n");
    }

    fwrite(s1, sizeof(Struct1), struct3.nElements, fp);
    fwrite(s2, sizeof(Struct2), NELEMENTS, fp);
    fwrite(&s3, sizeof(Struct3), 1, fp);

    printf("Save done.\n");
}

s1struct3.nElementss2NELEMENTS(这是常量),s3只是一个结构而不是数组。当我尝试使用HexEditor打开save.bin时,它会得到与我期望的结果截然不同的结果,我想知道我是否正确使用了fwrite函数,特别是对于结构数组。

1 个答案:

答案 0 :(得分:1)

您的功能存在小问题,可能会导致问题:

  • 您将函数定义为按值s3。为什么不将指针传递给第三个struct?在调用代码之前是否正确声明了saveFile函数?您确定调用代码是否按值传递struct

  • 您忘记关闭流。句柄丢失,在程序退出之前内容不会刷新到磁盘。

  • 您以"w+b"模式打开文件:使用read进行写入。使用二进制模式是正确的,但不必添加+进行读取。只需使用"wb"

  • 如果fopen失败,则输出诊断消息,但不从函数返回。尝试写入NULL流指针时,您将调用未定义的行为。

关于您的问题,文件的转储与您的预期不符...给我们提供更多信息,例如不同结构的定义和十六进制转储。以下是一些想法:

  • 结构中的某些字段可能需要特定的对齐,因此可以通过填充字节与前一个字段分开。这些填充字节的值不一定是0:如果结构在自动存储中或者用malloc分配,则它们的初始状态是未定义的,并且可以作为存储其他字段的副作用而改变。
  • 整数可以有不同的大小,并以文件中的小端或大端顺序存储,具体取决于编译程序的特定体系结构。因此,程序存储的值只能使用在相同体系结构和操作系统上运行的相应但相当类似的代码进行回读。
  • 如果您的结构包含指针,那么从输出文件中存储的值开始就无法理解。