fwrite / fread在Windows

时间:2017-06-09 09:30:56

标签: 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);

有什么想法吗?

2 个答案:

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