Редактирование файлов на месте, когда объем перезаписываемых данных отличается от исходных данных, представляет собой настоящую боль. Если ваш формат файла требует, чтобы данные были последовательными , а не имеет синтаксиса для дырок, у вас нет выбора, кроме как переписать файл (по крайней мере, с начала измененной позиции).
Кроме того, существуют дополнительные ограничения. Если вам требуется, чтобы данные были записаны на диск перед продолжением, вы можете использовать один std::fstream
для нескольких изменений. Операционные системы обычно не сбрасывают файл на диск, даже если вы вызываете метод flush()
в файловых потоках. Некоторые платформы предлагают непереносимые решения, чтобы действительно заставить запись. Поэтому, если вам нужно записать его на диск, лучше всего закрыть файл.
Таким образом, особенно для критических приложений, я бы рекомендовал второй подход (ifstream
при начальной загрузке, ofstream
при каждой записи). Я бы также порекомендовал записать во временный файл, а затем переместить всю перезапись в нужное место, заменив исходные файлы. Это гарантирует, что вы не потеряете данные (по крайней мере, в системах, предлагающих атомарное перемещение файлов).