В текстовом файле нужно установить курсор на определенную строку и перезаписать ее, не изменяя другие строки.
С удивлением не смог нагуглить вменяемого способа, без костылей, это сделать.
Плохо гуглил?
MikeNew
> С удивлением не смог нагуглить вменяемого способа, без костылей, это сделать.
а чё за костыли хоть нашёл?
MikeNew
> Плохо гуглил?
вообще есть функция
void replaceLineInFile( ...params... )
она делает как раз то, что тебе нужно
skalogryz
> а чё за костыли хоть нашёл?
Сначала открыть файл для чтения, считать строки, так определить нужную позицию, потом снова открыть файл уже для записи....
Или рекомендуют вообще сначала считать файл в память, сделать нужные изменения и потом перезаписать полностью.
оба решения хороши. Особенно если твой файл не привысит 2 гигов размером.
skalogryz
> void replaceLineInFile( ...params... )
Мне для C++ нужно.
MikeNew
> Мне для C++ нужно.
а там нет replaceLineInFile()?
может ты, просто, эту функцию не написал ещё?
skalogryz
> а там нет replaceLineInFile()?
> может ты, просто, эту функцию не написал ещё?
Гениально. :))
MikeNew
> Гениально. :))
возьми любой из двух костылей и реализуй.
можешь ещё такой костыль взять:
Из недостатков:
Можно, кстати, ChatGPT напрячь! его, как раз, пилили, чтобы такие задачки решать
MikeNew
> В текстовом файле нужно установить курсор на определенную строку и перезаписать
> ее, не изменяя другие строки.
> С удивлением не смог нагуглить вменяемого способа, без костылей, это сделать.
> Плохо гуглил?
Текстовый файл - это иллюзия. На самом диске, все файлы - бинарные.
Соответственно, замена подстроки в текстовом файле - это то же самое, что удалить кусок из байтового вектора и вставить на его место новый.
Если старый и новый кусок имеют разную длину - то всё, что идёт после куска, придётся сдвигать копированием. Как в векторе, так и в файле.
В общем, я бы сделал такой алгоритм:
1. Открыть исходный файл на чтение.
2. Создать новый пустой файл и открыть его на запись.
3. Скопировать replacementOffset байт из исходного файла в новый поблочно.
4. Пропустить length(oldText) байт в исходном файле.
5. Записать newText в новый файл.
6. Скопировать всё оставшееся содержимое исходного файла в новый поблочно.
7. Удалить исходный файл.
8. Переименовать новый файл на место исходного.
Если файл небольшой - пузырим его в память. Производим вставку необходимого текста. Открываем файл на запись - пишем в него ранее измененный буффер. Закрываем файл.
Если файл большой и память юзать жалко то можно сделать так - создаем временный файл, пишем туда в него что надо. Потом заменяем оригинальный на временный (старый удаляем, новый переименовываем именем старого).
gambit_oz
> Если файл большой и память юзать жалко то можно сделать так - создаем временный
> файл, пишем туда в него что надо. Потом заменяем оригинальный на временный
> (старый удаляем, новый переименовываем именем старого).
Это делается по разному для винды и для юникса. В юниксе не надо ничего переименовывать, сразу создаем файл с нужным именем. Там можно удалять открытый файл и он остается живым пока открыт, чем и пользуются для модификации.
Осознал, исчерпывающая информация. Всем спасибо.
А что, регулярные выражения не подходят?
Для чего эти пляски с бубном?
По моему они именно для этого сделаны.
Zab
> Это делается по разному для винды и для юникса. В юниксе не надо ничего
> переименовывать, сразу создаем файл с нужным именем. Там можно удалять открытый
> файл и он остается живым пока открыт, чем и пользуются для модификации.
Так никто не делает, потому что в случае, если программа зависнет, крашнется, или пользователь дёрнет провод, если при этом не останется ни старого, ни нового файла - это ультра зашквар.
Зачем писать программу, если можно воспользоваться sed?
Тема закрыта.