Как избежать потери данных при перезаписи файла прервано в C
Я написал код, который сохраняет прогресс в моей игре, но один из моих самых больших страхов - это короткое время при сохранении, когда эти данные могут быть повреждены в случае сбоя компьютера или потери питания.
Существует ли стандартная методология, использующая только стандартный заголовок ввода / вывода C, чтобы гарантировать, что предыдущий файл сохранения будет безопасным в случае сбоя программы при перезаписи, который не оставляет временных файлов?
2 ответа
Аналогичная идея, включающая комментарии поста:
@PC Luddite @Thomas Padron-McCarthy Martin James
Основная проблема заключается в том, что либо A) существует разрыв во времени между наличием действительного файла "state", либо B) существует небольшой интервал с двумя действительными файлами. Таким образом, в худшем случае ошибка заканчивается 0 файлами с использованием A и 2 файлами с использованием B. Очевидно, что 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) - Удалить TMP файлы.
Чтение государства.
- Ищи
State.txt
, если найден и действителен (проходит проверку достоверности), перейдите к шагу 3. - Иначе, ищите tmp файлы и используйте последний действительный. (Больше работ по восстановлению состояния пока не подробно.
- Очистка - удалить файлы tmp.
Алгоритм
Код записывает ход выполнения (t), t и код проверки (контрольная сумма, CRC и т. Д.) В 1 файл.
В следующий раз код записывает ход выполнения (t+1), t+1 и его проверочный код в другой файл.
Повторите два выше.
Чтобы восстановить, прочитайте оба файла и, конечно, по крайней мере 1 будет иметь действительный: прогресс, некоторые т и код проверки. Если оба хороши, используйте более поздний (больше t).