我的电脑最近突然关机了。当我重新打开电源时,我发现上次运行计算机时写的一些二进制文件已损坏。我对此进行了调查,发现这是因为使用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 |
,所以这绝对是断电的结果
答案 0 :(得分:0)
对于那些在第一段之后停止阅读的人,后面有三个步骤。
致电fflush(fp)
。这会将所有数据从C stdio缓冲区清除并进入操作系统缓冲区。
使用How do I get the file HANDLE from the fopen FILE structure?
然后在HANDLE上拨打FlushFileBuffers
。这会将所有数据从Windows操作系统缓冲区中清除并刷新到磁盘上。
答案 1 :(得分:-1)
您要找的是FlushFileBuffers
。在您的情况下,FlushFileBuffers(fileno(fd))
。
Windows中另一个有用的习惯用法是close(dup(fd))
,或者是close(dup(fileno(fp)))
。这会刷新目录条目,因此文件大小对于不断增长的文件是正确的。否则,只有在文件关闭时才会更新目录。
答案 2 :(得分:-4)
我可能是错的,但我相信fflush(fp);
可以做到这一点。