我已经编写了保存游戏进度的代码,但我最大的担忧之一是保存期间的短暂时间窗口,如果计算机崩溃或断电,数据可能会损坏。
是否有仅使用 C 的标准 I/O 标头的标准方法,以确保以前的保存/文件在程序在覆盖时崩溃时是安全的,不会留下临时文件?
包含帖子评论的类似想法:
@PC Luddite @Thomas Padron-McCarthy @Martin James
核心问题是 A)在有效“状态”文件之间存在时间间隔,或者 B)在 2 个有效文件之间存在小间隔。因此,最坏情况的失败以使用 A 的 0 个文件和使用 B 的 2 个文件结束。显然 B 是可取的。
编写状态 假设代码可能会在除 #1 之外的任何步骤之前、期间或之后崩溃。
State.txt
.State_tmp1.txt
. 要知道这个完成,一些检查代码应该是“状态”的一部分。该步骤可以与上一步结合作为覆盖。State_tmp1.txt
为State_tmp2.txt
以验证具有重命名权限的代码的某些方面。State.txt
为State_tmp3.txt
. 这是关键的一步。到目前为止,任何失败都是无关紧要的State.txt
。在下一步完成之前,State.txt
可能不存在,但至少存在 1 个 tmp 文件。State_tmp1.txt
为State.txt
. (或者State_tmp2.txt
如果使用了第 4 步。)读取状态。
State.txt
,如果找到且有效(通过有效性检查),继续执行步骤 3。算法
代码将进度(t)、t 和验证码(校验和、CRC 等)写入 1 个文件。
下一次,代码将progress(t+1)、t+1及其验证码写入另一个文件。
重复以上两个。
要恢复,读取两个文件,当然至少 1 会有一个有效的:进度,一些 t 和一个验证码。如果两者都很好,请使用后一个(更大的 t)。