ゲームの進行状況を保存するコードを書いたことがありますが、私の最大の懸念の 1 つは、コンピューターがクラッシュしたり電力が失われたりした場合に、保存中にデータが破損する可能性がある短い時間枠です。
C の標準 I/O ヘッダーのみを使用して、上書き中にプログラムがクラッシュした場合に以前の保存/ファイルが安全であり、一時ファイルを残さない標準的な方法はありますか?
アルゴリズム
コードは、progress(t)、t と検証コード (チェックサム、CRC など) を 1 つのファイルに書き込みます。
次回、コードはprogress(t+1)、t+1、およびその検証コードを別のファイルに書き込みます。
上記の2つを繰り返します。
復元するには、両方のファイルを読み取り、少なくとも 1 つに有効な進行状況、いくつかの t、および検証コードが含まれていることを確認してください。両方が良い場合は、後者 (より大きい t) を使用します。
投稿のコメントを組み込んだ同様のアイデア:
@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 に進みます。