Как избежать потери данных при перезаписи файла прервано в C

Я написал код, который сохраняет прогресс в моей игре, но один из моих самых больших страхов - это короткое время при сохранении, когда эти данные могут быть повреждены в случае сбоя компьютера или потери питания.

Существует ли стандартная методология, использующая только стандартный заголовок ввода / вывода C, чтобы гарантировать, что предыдущий файл сохранения будет безопасным в случае сбоя программы при перезаписи, который не оставляет временных файлов?

2 ответа

Решение

Аналогичная идея, включающая комментарии поста:
@PC Luddite @Thomas Padron-McCarthy Martin James

Основная проблема заключается в том, что либо A) существует разрыв во времени между наличием действительного файла "state", либо B) существует небольшой интервал с двумя действительными файлами. Таким образом, в худшем случае ошибка заканчивается 0 файлами с использованием A и 2 файлами с использованием B. Очевидно, что 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.

Алгоритм

Код записывает ход выполнения (t), t и код проверки (контрольная сумма, CRC и т. Д.) В 1 файл.
В следующий раз код записывает ход выполнения (t+1), t+1 и его проверочный код в другой файл.
Повторите два выше.

Чтобы восстановить, прочитайте оба файла и, конечно, по крайней мере 1 будет иметь действительный: прогресс, некоторые т и код проверки. Если оба хороши, используйте более поздний (больше t).

Другие вопросы по тегам