我可以同时更换和阅读吗?

时间:2011-02-15 09:51:47

标签: php file file-io

我有一个文件,我不想从这个文件中获取副本。

所以我想在PHP5中同时替换和阅读;

在我的脑海中,代码如下:

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

1 个答案:

答案 0 :(得分:3)

是的,你可以在概念上,但如果你用不同长度的内容替换内容将会很困难。

fgetsfprintf通过使用文件指针工作。指针基本上是您在文件中的位置。使用fgetsfprintf都将推进该指针。在打开它后立即考虑这个短文件的表示(>是指针):

>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)覆盖它。
  • 只需使用临时文件即可。没什么大不了的。