Могу ли я заменить и прочитать одновременно? - PullRequest
1 голос
/ 15 февраля 2011

У меня есть файл, и я не хочу брать копию с этого файла.

поэтому я бы хотел заменить и прочитать одновременно в PHP5;

В моей голове код будет следующим:

<?php
$fp = fopen('text', 'rw');
while (!feof($fp)) {
  $line = fgets($fp);
  $line = "CONVERTED";
  fprintf($fp,$line);
}
fclose($fp);

1 Ответ

3 голосов
/ 15 февраля 2011

Да, вы можете концептуально, но это будет трудно, если вы заменяете контент на контент другой длины.

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).
  • Просто используйте временный файл. Ничего страшного.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...