fwrite/fread 在 Windows 中运行不佳

wat*_*tou 0 c fwrite fread

我编写了一个程序,创建一个结构变量,然后使用函数将其写入文件中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);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

lx.*_*lx. 5

您还需要打开文件进行读取:

fopen(..., "w+")
Run Code Online (Sandbox Code Playgroud)

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

fopen(..., "w+b")
Run Code Online (Sandbox Code Playgroud)

如果你想fread直接在 a 之后,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);
   }
Run Code Online (Sandbox Code Playgroud)

(此示例用于rewind将文件指针设置为开头,您可能必须使用fseek代替)


需要注意的是:为了可移植,您不应该将结构直接写入磁盘,而应实际序列化它(即手动将每个字段写入文件,可能以一个小标头为前缀),因为编译器特定的填充可能(或将)导致问题。