我使用 C++ 将一些数据保存在二进制文件中。保存数据两分钟后,计算机电源突然切断。当我重新启动计算机时,数据已损坏。当我读取二进制文件时,所有值都是0
,这肯定不是我写入文件的内容。
电脑突然断电会损坏我文件中的数据吗?还是说不可能出现这种情况,因为一旦写入并保存到磁盘的数据就不会损坏,即使突然断电也是如此?如果是后者,那么我将不得不开始详细调查这个问题,但我真的不怀疑还有什么问题。该程序非常简单,已经使用了 2 年,这是我第一次看到使用该程序写入的文件出现数据损坏。
PS 文件确实已保存完毕。保存文件的程序正确管理文件 I/O - 它在完成写入后关闭文件。此外,断电时程序甚至没有运行。这发生在 Windows 8.1 上。
答案1
简而言之,当您创建数据文件时,操作系统必须执行以下三件事:
- 分配包含数据所需的块。
- 将零写入这些块中,或者如果您尝试读取它们,则会导致显示零。
- 将数据写入分配的块。
由于系统安全的原因,第 2 步是必需的。分配的块可能之前包含其他人的数据,如果允许您读取他们的旧数据,系统将面临安全漏洞。因此,您得到的是零。如果在第 2 步和第 3 步之间断电,您会看到零而不是您的数据。
根据底层操作系统和文件系统,除非您在程序中明确将数据同步到磁盘,否则步骤 3 可能会在步骤 2 之后任意长时间发生。
在 POSIX 兼容系统上,调用fsync()以确保您的数据已达到永久存储。