Лучший способ сделать то, что вы хотите, это использовать утилиту вроде sed. Это быстрее и использует меньше памяти, чем то, что вы (или я) написали бы.
Помимо этого, давайте предположим, что вы все равно хотите написать и написать сами.
Файл похож на длинный массив байтов. Если вы хотите увеличить или уменьшить длину одной строки, это влияет на положение каждого байта в остальной части файла. Результат может быть короче (или длиннее) оригинала. Поскольку результат может быть короче, изменение файла на месте - плохая идея.
Следующий псевдокод иллюстрирует простой подход:
open original file
open output file
allocate a line buffer that is large enough
read a line from the original file
do
return an error if the buffer is too small
manipulate the line
write the manipulated line to the output file
read a line from the original file
loop until read returns nothing
sed делает это намного умнее. Однажды я увидел объяснение того, как работает sed, но моя карма Google не может его найти.
Изменить:
Как это сделать с помощью sed:
sed -e 's/.*\#.*/heet/g' myfile.txt
Команда s или замена sed
может заменить одну строку или регулярное выражение другой строкой.
Приведенная выше команда интерпретируется как:
заменить любую строку, в которой где-то есть #
, на heet
. Последний g говорит sed
сделать это глобально, то есть во всем файле.
Edit2:
По умолчанию sed записывает в стандартный вывод.
Чтобы переписать файл, вы должны перенаправить вывод в файл, а затем переименовать его.
В linux выполните следующее (вы можете запустить командную строку из C с помощью system
):
sed -e 's/.*\#.*/heet/g' myfile.txt > temp_file123.txt
rm myfile.txt
mv temp_file123.txt myfile.txt
Из C:
system("sed -e 's/.*\#.*/heet/g' myfile.txt > temp_file123.txt");
system("rm myfile.txt");
system("mv temp_file123.txt myfile.txt");
Если вы хотите сделать это всего одним вызовом system
, поместите все содержимое командной строки в сценарий оболочки.