如何避免在C语言中重写文件中断时丢失数据



我已经编写了保存游戏进程的代码,但我最大的担忧之一是保存过程中的短暂时间窗口,当计算机崩溃或断电时,数据可能会损坏。

是否有标准的方法只使用C的标准I/O头,以确保以前的保存/文件将是安全的,如果程序崩溃,而覆盖它,这不会留下临时文件?

类似的想法:
@PC Luddite @Thomas Padron-McCarthy @Martin James

核心问题是A)在拥有一个有效的"状态"文件之间存在时间间隔,或者B)在拥有两个有效文件之间存在很小的间隔。因此,在最坏的情况下,使用a会导致0个文件,使用B会导致2个文件。显然,B更可取。

编写状态假设代码可能在除#1之外的任何步骤之前,期间或之后崩溃。

  1. 假设初始状态(或进度)文件存在:State.txt .
  2. 如果存在,请删除以前的临时文件。(辅助)
  3. 将新状态写入临时文件:State_tmp1.txt。要知道这已经完成,一些检查代码应该是"状态"的一部分。此步骤可以与前一步合并作为覆盖。
  4. 迂腐的步骤-可选。将State_tmp1.txt重命名为State_tmp2.txt以验证某些方面的代码具有重命名权限。
  5. State.txt重命名为State_tmp3.txt。这是关键的一步。到目前为止,任何失败都是无关紧要的,因为State.txt存在。在下一步完成之前,可能不存在State.txt,但至少存在1个tmp文件。
  6. State_tmp1.txt重命名为State.txt。(或从State_tmp2.txt如果步骤4使用。)
  7. 删除tmp文件。

读取状态。

  1. 搜索State.txt,如果有效(通过有效性检查),继续步骤3。
  2. 否则,查找tmp文件并使用最新的有效文件。(更多的工作来恢复状态尚未详细。
  3. 清理-删除tmp文件

算法

Code将进度(t)、t和一个验证码(校验和、CRC等)写在一个文件中。
下一次,代码写入进度(t+1), t+1并将其验证码放在另一个文件中。
重复以上两点。

要恢复,读取两个文件,当然至少有一个有效的进度,一些t和验证码。如果两者都好,则使用后一个(较大的t)。

最新更新