我写了一个程序,创建一个结构变量,然后使用函数fwrite
将其写入文件。返回的代码是1(我只写了一个结构变量)。当我尝试使用fread
函数读取文件时,它返回0
并且变量未完全填充。
此问题仅适用于Windows。我在Linux(Ubuntu虚拟机)上尝试了相同的代码并且运行良好。
这是结构:
struct MyStruct
{
char comment[40];
int nbpts;
float time[4096];
float value[4096];
};
FILE* fp = fopen(fileTrace, "w");
fwrite(&var, sizeof(struct MyStruct), 1, fp);
fread(&var, sizeof(struct MyStruct), 1, fp);
有什么想法吗?
答案 0 :(得分:4)
您还需要打开文件进行阅读:
fopen(..., "w+")
您应该以二进制模式打开它,因此fwrite
/ fread
不会进行任何时髦的字符转换(例如Windows的平台特定行结束):
fopen(..., "w+b")
如果您想在fread
之后直接fwrite
,则必须重置文件指针位置,以便fread
从您编写数据的位置开始读取。
总结:
if ((fp = fopen("var.dat", "w+b")) != NULL) {
fwrite(&var, sizeof(var), 1, fp);
rewind(fp);
memset(&var, 0, sizeof(var)); // reset var
fread(&var, sizeof(var), 1, fp);
// ...
fclose(fp);
}
(此示例使用rewind
将文件指针设置为开头,您可能必须使用fseek而
提醒:为了便携,您不应该直接将结构写入磁盘,而是将其序列化(即手动将每个字段写入文件,可能以小标题为前缀) ),因为特定于编译器的填充可能(或将会)导致问题。
答案 1 :(得分:-1)
int main()
{
const char *pFIle = "test.txt";
char var[sizeof(struct MyStruct)] = {0};
int ret = 0;
FILE* fp = fopen(pFIle, "w+");
ret = fwrite(&var, sizeof(struct MyStruct), 1, fp);
printf("fwrite ret =%d;\r\n", ret);
fflush(fp);
fseek(fp, 0, SEEK_SET);
ret = fread(&var, sizeof(struct MyStruct), 1, fp);
printf("fread ret =%d;\r\n", ret);
return 0;
}
我有测试,Windows上一切正常。如果您有其他问题,请告诉我。