使用fsync()在C或C ++中保存二进制文件

时间:2015-09-14 23:05:33

标签: c++ windows file file-io binaryfiles

我的电脑最近突然关机了。当我重新打开电源时,我发现上次运行计算机时写的一些二进制文件已损坏。我对此进行了调查,发现这是因为使用fwrite编写的数据不能保证立即写入磁盘。有人告诉我,为了保存我的数据而不会在另一次突然停电的情况下丢失数据,我应该使用fsync功能。但看起来unistd.h位于fsync。我在Windows上,如何在Windows上执行相当于void WriteBinFile(float var1, float var2, float var3) { FILE *fp; fopen_s(&fp, "filename.dat", "wb"); fwrite((void*)&var1, sizeof(float), 1, fp); fwrite((void*)&var2, sizeof(float), 1, fp); fwrite((void*)&var3, sizeof(float), 1, fp); // fsync(fp) ??? No such function exists on Windows. Here I want a facility to write data to disk in non-volatile manner. fclose(fp); } 的操作?

我想保护使用简单程序编写的数据,如下所示 -

0

P.S。为什么我没有UPS是一个漫长而无趣的故事。另外,我使用的是Windows 8.1并使用Visual Studio 2013.此外,由于突然停电而受影响的文件包含0秒。其中一些充满了0 s,其中一些只是部分充满了0 s。我没有在文件中写| FileName | ProductName | |:-----------|:------------| | 12345.jpg |Honda | | 14578.jpg |Toyota | | 11475.jpg |Honda | | 11457.jpg |Nissan | | 11145.jpg |Honda | | 24879.jpg |BMW | | 22222.jpg |Honda | | 21545.jpg |Honda | | 55552.jpg |Honda | ,所以这绝对是断电的结果

3 个答案:

答案 0 :(得分:0)

对于那些在第一段之后停止阅读的人,后面有三个步骤。

  1. 致电fflush(fp)。这会将所有数据从C stdio缓冲区清除并进入操作系统缓冲区。

  2. 使用How do I get the file HANDLE from the fopen FILE structure?

  3. 然后在HANDLE上拨打FlushFileBuffers。这会将所有数据从Windows操作系统缓冲区中清除并刷新到磁盘上。

答案 1 :(得分:-1)

您要找的是FlushFileBuffers。在您的情况下,FlushFileBuffers(fileno(fd))

Windows中另一个有用的习惯用法是close(dup(fd)),或者是close(dup(fileno(fp)))。这会刷新目录条目,因此文件大小对于不断增长的文件是正确的。否则,只有在文件关闭时才会更新目录。

答案 2 :(得分:-4)

我可能是错的,但我相信fflush(fp);可以做到这一点。