Общий комментарий «Вы должны переписать весь файл» применяется, когда строка, которую вы заменяете, имеет длину L1, а добавляемая строка имеет длину L2 и L1 ≠ L2. Беда в том, что если L1 больше, чем L2, то вы должны переместить данные в оставшейся части файла вниз по файлу, чтобы не оставить пробел с мусором там, где был конец строки (и вы должны отрубить хвост файл - сокращая его, чтобы не оставить мусор в конце). И наоборот, если L1 меньше, чем L2, вы должны перемещать строки после строки в файле, чтобы новая строка не перезаписывала начало следующей строки.
В случае файлов .dat и .idx вы обнаружите, что действительно, вы правы: программа не переписывает весь файл каждый раз. Существует умеренная вероятность того, что файлы представляют собой файл C-ISAM или одну из связанных систем (D-ISAM, T-ISAM и т. Д.). В оригинальном (Informix) C-ISAM файл .dat содержит записи фиксированной длины, поэтому можно записывать поверх любой старой записи новую запись, потому что L1 = L2, всегда. Файл .idx является более сложным, но он разбит на страницы (возможно, всего 512 байт на страницу), и когда требуется редактирование, вся страница перезаписывается. Поскольку все страницы имеют одинаковый размер, L1 = L2 снова - и можно безопасно переписать только измененный раздел индексного файла.
Когда файл C-ISAM содержит данные переменной длины, фиксированная часть записи сохраняется в файле .dat, а часть данных переменной длины сохраняется на страницах в файле .idx. У этой договоренности есть только одна заслуга - она оставляет записи в файле .dat фиксированного размера.