Проблема в том, что вы перезаписываете файл, который читаете.Таким образом, если бы одна строка стала длиннее, вы бы перезаписали символы следующей строки.
Поскольку 002
становится 02
, а не 2
, я буду считать, что No
в файле сопровождается пробелом.Поэтому, если я использую для отображения видимым способом LineFeed, следующее содержимое вашего файла:
...NO <LF>002...
будет перезаписано:
...1001<LF>02...
^ (end of the write, remaining chars unchanged)
Таким образом, 3 символа No
перезаписываются 100
, LineFeed перезаписывается 1
, а 0
перезаписывается новым LineFeed
.
Если вы хотите писать на месте, как вы пытаетесь здесь, вы должны убедиться, что размер каждой строки остается фиксированным при любых обстоятельствах.Поэтому после «Нет» следует номер пробела, соответствующий длине номера книги.
Другие замечания
Это не является причиной ошибки, но tellg()
возвращаетstd::streampos
, который может быть намного больше, чем int
.Поэтому я бы рекомендовал:
auto oldPos = fp.tellg(); // here you're sure it's the right type
Обратите внимание, что tellg()
/ seekg()
предназначены для входного потока и tellp()
/ seekp()
для выходных потоков.К счастью, для двунаправленных файловых потоков существует только одна позиция для чтения и записи.Но для других типов двунаправленных строк это не гарантируется (см. этот вопрос ).
Наконец, если ваша цель - перезаписать последнюю строку, прочитайте (и нашли), что вы должны время от времени обновлять ее.