fwrite/fread 在 Windows 中效果不佳

fwrite/fread doesn't work well in Windows

我写了一个程序,创建一个结构变量,然后使用函数 fwrite 将它写入文件。返回码是1(我只写了一个结构变量)。当我尝试使用 fread 函数读取文件时,它 returns 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);

有什么想法吗?

您也需要打开文件进行阅读:

fopen(..., "w+")

并且您应该以二进制模式打开它,因此 fwrite/fread 不会进行任何古怪的字符转换(例如 Windows 的平台特定 line-endings) :

fopen(..., "w+b")

如果您想在 fwrite 之后直接 fread 您必须重置文件指针位置,以便 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


提醒一句:为了便携,你不应该将结构直接写入磁盘,而是实际序列化它(即手动将每个字段写入文件,也许以小 header 为前缀),因为 compiler-specific 填充可能(或将)导致问题。

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 上一切正常。如果您还有其他问题,请告诉我。