我有一个文件,我不想从这个文件中获取副本。
所以我想在PHP5中同时替换和阅读;
在我的脑海中,代码如下:
<?php
$fp = fopen('text', 'rw');
while (!feof($fp)) {
$line = fgets($fp);
$line = "CONVERTED";
fprintf($fp,$line);
}
fclose($fp);
答案 0 :(得分:3)
是的,你可以在概念上,但如果你用不同长度的内容替换内容将会很困难。
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)
覆盖它。