Файл - это просто последовательность байтов, среди которых встречаются переносы строк. Т.е. если вы работаете с файлом:
строка 1строчка 2строка 3
...то на самом деле на диске лежит последовательность байтов:
строка 1␊строчка 2␊строка 3
Вы можете , не пересчитывая/перезаписывая весь файл, как внутри строки, так и между строк, например:
строка 1␊XXXXXXXXXXXтрока 3
тогда, просматривая файл по строкам, вы увидите:
строка 1XXXXXXXXXXXтрока 3
...но никак нельзя удалить кусок из середины файла, ничего не делая с той частью, которая идет после удаляемого куска.
Вы можете построить код таким образом, чтобы , например, если удаляем строку 1:
читаем ""строка 1"", пропускаем:
↓ позиция для чтения строка 1␊строчка 2␊строка 3 ↑ позиция для записи
читаем ""строчка 2"":
↓ позиция для чтения строка 1␊строчка 2␊строка 3 ↑ позиция для записи
Записываем ""строчка 2"" на новое место:
↓ позиция для чтения строчка 2␊трочка 2␊строка 3 ↑ позиция для записи
Аналогично, читаем ""строка 3"" и пишем ее на новое место:
↓ позиция для чтения строчка 2␊строка 3␊строка 3 ↑ позиция для записи
Обрезаем ненужное место в конце файла:
строчка 2␊строка 3␊
Если вы хотите не удалять строку, а вместо одной строки писать другую, то надо быть внимательным в случае если новая строка длиннее старой. На этот случай примера кода у меня нет.
Как видно, плоские файлы - неудачный способ хранения большого объема данных, если нужно что-то менять ""посередине"". Если вы сами создаете этот файл, возможно стоит рассмотреть другие форматы хранения, более эффективные для нужных вам операций.