1

ゲームの進行状況を保存するコードを書いたことがありますが、私の最大の懸念の 1 つは、コンピューターがクラッシュしたり電力が失われたりした場合に、保存中にデータが破損する可能性がある短い時間枠です。

C の標準 I/O ヘッダーのみを使用して、上書き中にプログラムがクラッシュした場合に以前の保存/ファイルが安全であり、一時ファイルを残さない標準的な方法はありますか?

4

2 に答える 2

1

アルゴリズム

コードは、progress(t)、t と検証コード (チェックサム、CRC など) を 1 つのファイルに書き込みます。
次回、コードはprogress(t+1)、t+1、およびその検証コードを別のファイルに書き込みます。
上記の2つを繰り返します。

復元するには、両方のファイルを読み取り、少なくとも 1 つに有効な進行状況、いくつかの t、および検証コードが含まれていることを確認してください。両方が良い場合は、後者 (より大きい t) を使用します。

于 2015-10-23T03:42:15.540 に答える
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.txtして、名前変更権限を持つコードのいくつかのState_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 に答える