Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在不覆盖内容的情况下,在特定位置使用fwrite()_Php - Fatal编程技术网

Php 在不覆盖内容的情况下,在特定位置使用fwrite()

Php 在不覆盖内容的情况下,在特定位置使用fwrite(),php,Php,编辑:对于其他寻找答案的人,我使用了。可能是解决这个问题的最快方法 假设我有一个非常大的test.txt文件,其中包含: line1 line4 line5 line6 我希望在第1行之后添加第2行和第3行。我使用以下代码来实现这一点: $file = fopen('test.txt', 'r+'); fseek($file, 5); fwrite($file, "\r\nline2\r\nline3\r\n"); 但是,txt文件现在变为,第4行和第5行被覆盖: line1 line2

编辑:对于其他寻找答案的人,我使用了。可能是解决这个问题的最快方法


假设我有一个非常大的
test.txt
文件,其中包含:

line1
line4
line5
line6
我希望在第1行之后添加第2行和第3行。我使用以下代码来实现这一点:

$file = fopen('test.txt', 'r+');
fseek($file, 5);
fwrite($file, "\r\nline2\r\nline3\r\n");
但是,txt文件现在变为,第4行和第5行被覆盖:

line1
line2
line3
line6
我在
fopen
中使用
c+
模式得到了相同的结果。我不能使用
a
a+
,因为它们只是将内容附加到文件的末尾。我也不能把整个文件读入一个字符串并分析它以进行更改,因为这个文件非常大

有办法解决这个问题吗


注意:任何涉及将整个文件作为字符串读取,然后从中进行更改的解决方案都是不可行的,因为文件中有大量内容。如果在第一行和第二行之间的几行中添加内容有任何大胆的变通方法,那就足够了不幸的是,
fopen
和friends不允许插入,只允许附加内容。从他们的角度来看,该文件是一个大的、可扩展的数组。因此,不需要调用插入数据,只需要重写


然而,你可以通过几种方式来解决这个问题。一种简单的方法是使用
a
打开一个临时文件,
fwrite
将原始文件的第1行写入其中,附加第2行和第3行,然后将原始文件的其余部分分块写入临时文件。传输完整个文件后(请注意,不必立即将整个文件加载到内存中),就可以将临时文件移到原始文件的顶部。

可以通过从每行创建一个数组来完成此操作。然后用您想要的内容替换搜索的行

$searchLine = 'line1'; 
$file = getcwd()."test.txt";
$lineArray = file( $file , FILE_IGNORE_NEW_LINES ); 
$lineArray[$searchLine] =  $searchLine."\r\nline2\r\nline3\r\n"; // Replace the line with new ones
file_put_contents( $filename , implode( PHP_EOL, $lineArray) ); // Put the content

您不能简单地将新内容添加到文件中间;当您插入新字符时,文件系统不会将所有内容重新排列,实际上您必须自己编写代码来完成这项工作。。。。通常打开1个文件进行读取,1个文件进行写入,然后在末尾重命名。通常,您可以从第一个文件到第二个文件,一直到查找位置,然后手动将新内容添加到第二个文件,然后将剩余的内容从查找位置流式复制到文件的末尾。您可以添加足够的空白,使您有空间插入两行,然后将该行复制到该位置,然后重新插入该行和另一行。但这并不理想,因为每一行都需要空格,并且当您添加/覆盖行时,它会降低(您只能在中添加与留下的空白相同的数据)。它还会不必要地增大文件大小。基本问题是每个字节(字符)在文件中都有一个位置,就像网格上的钉子一样。要查找,只需将指针移动到网格单元格,然后从那里写入,覆盖网格单元格中的现有标记。仅使用纯php?如果文件真的很大-请尝试
exec
with:`gawk-i inplace-v n=line_number-v s=“content”'NR==n{print s}{print}路径到_文件`问题是文件很大,所以这可能不可行。@chris97ong用preg\u replace替换这些行怎么样?我不知道正则表达式是否适用于此,但只是一个想法。@mertizici任何需要读取整个文件内容的解决方案都不是很可行:/@chris97ong-使用任何文件流函数都可以处理最大整数(32位或64位)大小的文件。像
fread
这样的流式处理一次只读取文件的一小部分,然后重用内存。读取一个大文件可能需要时间,但我已经成功地读取了超过1000万行和千兆字节大小的文件。如果我没记错的话,我认为(2GB)是32位系统的限制。