我正在写一个函数,它应该在二进制文件中保存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");
}
s1
有struct3.nElements
,s2
有NELEMENTS
(这是常量),s3
只是一个结构而不是数组。当我尝试使用HexEditor打开save.bin时,它会得到与我期望的结果截然不同的结果,我想知道我是否正确使用了fwrite
函数,特别是对于结构数组。
答案 0 :(得分:1)
您的功能存在小问题,可能会导致问题:
您将函数定义为按值s3
。为什么不将指针传递给第三个struct
?在调用代码之前是否正确声明了saveFile
函数?您确定调用代码是否按值传递struct
?
您忘记关闭流。句柄丢失,在程序退出之前内容不会刷新到磁盘。
您以"w+b"
模式打开文件:使用read进行写入。使用二进制模式是正确的,但不必添加+
进行读取。只需使用"wb"
。
如果fopen
失败,则输出诊断消息,但不从函数返回。尝试写入NULL
流指针时,您将调用未定义的行为。
关于您的问题,文件的转储与您的预期不符...给我们提供更多信息,例如不同结构的定义和十六进制转储。以下是一些想法:
0
:如果结构在自动存储中或者用malloc
分配,则它们的初始状态是未定义的,并且可以作为存储其他字段的副作用而改变。