1

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

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

4

2 回答 2

1

包含帖子评论的类似想法:
@PC Luddite @Thomas Padron-McCarthy @Martin James

核心问题是 A)在有效“状态”文件之间存在时间间隔,或者 B)在 2 个有效文件之间存在小间隔。因此,最坏情况的失败以使用 A 的 0 个文件和使用 B 的 2 个文件结束。显然 B 是可取的。

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

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

读取状态。

  1. 搜索State.txt,如果找到有效(通过有效性检查),继续执行步骤 3。
  2. 否则,寻找 tmp 文件并使用最新的有效文件。(恢复状态的更多工作尚未详细说明。
  3. 清理 - 删除 tmp 文件。
于 2015-10-23T12:24:08.697 回答
1

算法

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

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

于 2015-10-23T03:42:15.540 回答