Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.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在文件开头追加_Php - Fatal编程技术网

用PHP在文件开头追加

用PHP在文件开头追加,php,Php,嗨,我想使用php在文件的开头追加一行 例如,假设文件包含以下contnet: Hello Stack Overflow, you are really helping me a lot. 现在我想在前一行的顶部添加一行,如下所示: www.stackoverflow.com Hello Stack Overflow, you are really helping me a lot. 这是我目前在脚本中使用的代码 $fp = fopen($file, 'a+'

嗨,我想使用php在文件的开头追加一行

例如,假设文件包含以下contnet:

    Hello Stack Overflow, you are really helping me a lot.
现在我想在前一行的顶部添加一行,如下所示:

    www.stackoverflow.com
    Hello Stack Overflow, you are really helping me a lot.
这是我目前在脚本中使用的代码

    $fp = fopen($file, 'a+') or die("can't open file");
    $theOldData = fread($fp, filesize($file));
    fclose($fp);

    $fp = fopen($file, 'w+') or die("can't open file");
    $toBeWriteToFile = $insertNewRow.$theOldData;
    fwrite($fp, $toBeWriteToFile);
    fclose($fp);
我想要一些最佳的解决方案,因为我正在php脚本中使用它。以下是我在这里找到的一些解决方案:

在开头添加以下内容:

    <?php
    $file_data = "Stuff you want to add\n";
    $file_data .= file_get_contents('database.txt');
    file_put_contents('database.txt', $file_data);
    ?>
所以我的最后一个问题是,在所有上述方法中,哪一种是最好的方法。还有比上面更好的吗


寻找你对此的想法

我个人喜欢在写入文件时使用

从手册中:

此函数与调用fopen()、fwrite()和fclose()相同 连续地将数据写入文件

因为该函数会自动为我处理这三个函数,所以我不必在处理完资源后记得关闭它

function file_prepend ($string, $filename) {

  $fileContent = file_get_contents ($filename);

  file_put_contents ($filename, $string . "\n" . $fileContent);
}
用法:

file_prepend("couldn't connect to the database", 'database.logs');

在文件的第一行之前没有真正有效的写入方法。您的问题中提到的两种解决方案都是通过复制旧文件中的所有内容然后写入新数据来创建新文件(这两种方法之间没有太大区别)

如果你真的追求效率,即避免现有文件的整个副本,并且你需要将最后插入的行作为文件中的第一行,这完全取决于你在创建文件后打算如何使用该文件

三个文件

根据您的评论,您可以创建三个文件
页眉
内容
页脚
,并按顺序输出每个文件;即使在
内容
之后创建了
标题
,也可以避免复制

在一个文件中反向工作

此方法将文件放入内存(数组)。
因为您知道要在页眉之前创建内容,所以请始终按与页脚、内容、页眉相反的顺序写行:

function write_reverse($lines, $file) { // $lines is an array
   for($i=count($lines)-1 ; $i>=0 ; $i--) fwrite($file, $lines[$i]);
}
然后首先用页脚调用
write\u reverse()
,然后调用内容,最后调用页眉。每次你想在文件的开头添加一些东西,只需在结尾写

然后读取文件进行输出

$lines = array();
while (($line = fgets($file)) !== false) $lines[] = $line;

// then print from last one
for ($i=count($lines)-1 ; $i>=0 ; $i--) echo $lines[$i];

还有另一个需要考虑的问题:您是否可以完全避免使用文件?例如,通过您的意思是预结束。我建议您阅读这一行,并在不丢失数据的情况下用下一行替换它

<?php

$dataToBeAdded = "www.stackoverflow.com";
$file = "database.txt"; 

$handle = fopen($file, "r+");

$final_length = filesize($file) + strlen($dataToBeAdded );

$existingData = fread($handle, strlen($dataToBeAdded ));

rewind($handle);

$i = 1;

while (ftell($handle) < $final_length) 
{

  fwrite($handle, $dataToBeAdded );

  $dataToBeAdded  = $existingData ;

  $existingData  = fread($handle, strlen($dataToBeAdded ));

  fseek($handle, $i * strlen($dataToBeAdded ));

  $i++;
}
?>


来自手动
如果文件名不存在,则创建该文件。否则,现有文件将被覆盖,除非设置了file\u APPEND标志。
@Robert,我的问题是,这是最好的方法。请通读一遍。我在问题中也提到了你可能的重复,因为它已经被问到了。文件也是用PHP读取的吗?(生成的文件以后是否在PHP中进行读取处理?
file\u get\u contents
可能需要读取内存中的完整文件。。如何像“w+”一样一部分一部分地读?@ring0,我对你的问题还不太了解。我只使用php进行读写。程序员。。。“总是懒惰,”德妮丝想。但是如果我使用这个
函数write_reverse($lines,$file){/$lines是($I=count($lines)-1;$I>=0;$I--)fwrite($file,$lines[$I]);)的数组
这将消耗文件每一行的重复时间,而不是当前解决方案一次将整个数据写入文件。这取决于最初创建文件的方式(这不是问题的一部分)。创建或扩展文件时,
write\u reverse
仅执行一次。当然,解释PHP中的逐行操作要比唯一的操作慢一点-但是使用
write\u reverse
在添加头之类的内容时不会复制整个文件。。。只有新线。这将产生影响,尤其是当文件很大时。
<?php

$dataToBeAdded = "www.stackoverflow.com";
$file = "database.txt"; 

$handle = fopen($file, "r+");

$final_length = filesize($file) + strlen($dataToBeAdded );

$existingData = fread($handle, strlen($dataToBeAdded ));

rewind($handle);

$i = 1;

while (ftell($handle) < $final_length) 
{

  fwrite($handle, $dataToBeAdded );

  $dataToBeAdded  = $existingData ;

  $existingData  = fread($handle, strlen($dataToBeAdded ));

  fseek($handle, $i * strlen($dataToBeAdded ));

  $i++;
}
?>