使用fsync()在C或c++中保存二进制文件
Using fsync() for saving binary files in C or C++
我的电脑最近突然关机了。当我重新开机时,我发现我上次在电脑运行时写的一些二进制文件被损坏了。我对此进行了研究,发现这是因为使用fwrite
写入的数据不能保证立即写入磁盘。我被告知,为了保存我的数据而没有在另一次突然停电的情况下丢失数据的风险,我应该使用fsync
功能。但它看起来像是位于unistd.h
的Unix/Linux专用设施。我在Windows上,我如何在Windows上执行等同于fsync
的操作?
我想保护使用如下简单程序写入的数据-
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);
}
注:为什么我没有UPS,这是一个又长又无趣的故事。此外,我使用的是Windows 8.1和Visual Studio 2013。此外,由于突然停电而受影响的文件包含0
s。其中一些充满了0
s,而另一些只部分充满了0
s。我没有将0
s写入文件,所以这肯定是停电的结果
对于读到第一段就停止阅读的人,下面有三个步骤。
-
呼叫
fflush(fp)
。这将把所有数据从C工作室缓冲区中刷新到操作系统缓冲区中。 -
使用我如何从fopen文件结构中获得文件句柄?
-
然后调用HANDLE上的
FlushFileBuffers
。这将把所有的数据从Windows操作系统缓冲区中刷新到磁盘上。
你要找的是FlushFileBuffers
。在你的例子中,FlushFileBuffers(fileno(fd))
.
在Windows中另一个有用的习语是由close(dup(fd))
给出的,或者在你的例子中是close(dup(fileno(fp)))
。这将刷新目录条目,以便文件大小对于正在增长的文件是正确的。
我可能错了,但我相信fflush(fp);
应该能做到这一点。
相关文章:
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 在C++中将类(带有Vector成员)保存为二进制文件
- C++.我想将更改后的特定字符行保存在字符串中
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- 哈希文件递归并保存到矢量Cryptopp中
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 无法通过头文件保存变量的值
- 我们可以将数据永久保存为数据结构吗?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 保存/加载大量短数组到二进制文件
- Gstreamer:每 5 秒使用多文件墨水保存图像/jpeg
- 如何访问由共享指针保存的类方法?
- 为什么签名字符可以保存大于 127 的值?
- 一个变量的输入值也会保存到另一个变量中