Да, вы можете концептуально, но это будет трудно, если вы заменяете контент на контент другой длины.
fgets
и fprintf
работают с указателем файла. Указатель в основном там, где вы находитесь в файле. Оба с использованием fgets
и fprintf
будут продвигать этот указатель. Рассмотрим это представление короткого файла (указатель >
) сразу после его открытия:
>First line
Second line
Third line
Затем вы запускаете свой первый fgets
, который читает строку и перемещает указатель:
First line
>Second line
Third line
Теперь, если вы попытаетесь записать в файл, он напишет, где находится указатель; перезаписывая контент. Допустим, вы изменили «Первая строка» на «Foobar» и попробуйте написать сразу после вызова fgets
(как в вашем коде), это будет результат:
First line
Foobar> line
Third line
Обратите внимание, что указатель теперь находится в середине строки.
Однако если вы перемотаете указатель перед использованием fprintf
, он будет напечатан в нужном месте:
<?php
$fp = fopen('text', 'rw');
while (!feof($fp)) {
$line = fgets($fp);
fseek($fp, -strlen($line), SEEK_CUR);
// length has to be identical to string you replaced
$line = "FoobarLine";
fprintf($fp,$line);
}
fclose($fp);
?>
Обратите внимание, что это НЕ будет работать, если ваши строки замены отличаются по размеру от оригинала, так как затем будут перезаписывать данные, которые не должны, или начнут читать не в том месте.
Лучшее решение будет:
- если файл достаточно маленький; используйте
file
, чтобы загрузить его построчно, измените массив по своему вкусу и перезапишите его, используя file_put_contents(implode("\n", $array)
.
- Просто используйте временный файл. Ничего страшного.