需要用PHP写在文件的开头
我正在做这个程序,我试图找出如何将数据写入文件的开始,而不是结束。 “a”/ append只写到最后,我怎样才能把它写到开头? 因为“r +”这样做,但会覆盖以前的数据。
$datab = fopen('database.txt', "r+");
这是我的整个文件:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Facebook v0.1</title> <style type="text/css"> #bod{ margin:0 auto; width:800px; border:solid 2px black; } </style> </head> <body> <div id="bod"> <?php $fname = $_REQUEST['fname']; $lname = $_REQUEST['lname']; $comment = $_REQUEST['comment']; $datab = $_REQUEST['datab']; $gfile = $_REQUEST['gfile']; print <<<form <table border="2" style="margin:0 auto;"> <td> <form method="post" action=""> First Name : <input type ="text" name="fname" value=""> <br> Last Name : <input type ="text" name="lname" value=""> <br> Comment : <input type ="text" name="comment" value=""> <br> <input type ="submit" value="Submit"> </form> </td> </table> form; if((!empty($fname)) && (!empty($lname)) && (!empty($comment))){ $form = <<<come <table border='2' width='300px' style="margin:0 auto;"> <tr> <td> <span style="color:blue; font-weight:bold;"> $fname $lname : </span> $comment </td> </tr> </table> come; $datab = fopen('database.txt', "r+"); fputs($datab, $form); fclose($datab); }else if((empty($fname)) && (empty($lname)) && (empty($comment))){ print" please input data"; } // end table $datab = fopen('database.txt', "r"); while (!feof($datab)){ $gfile = fgets($datab); print "$gfile"; }// end of while ?> </div> </body> </html>
快速和肮脏:
<?php $file_data = "Stuff you want to add\n"; $file_data .= file_get_contents('database.txt'); file_put_contents('database.txt', $file_data); ?>
如果您不想将文件的全部内容加载到variables中,可以使用PHP的Streamsfunction:
function prepend($string, $orig_filename) { $context = stream_context_create(); $orig_file = fopen($orig_filename, 'r', 1, $context); $temp_filename = tempnam(sys_get_temp_dir(), 'php_prepend_'); file_put_contents($temp_filename, $string); file_put_contents($temp_filename, $orig_file, FILE_APPEND); fclose($orig_file); unlink($orig_filename); rename($temp_filename, $orig_filename); }
这样做是将你想要预先写入的string写入临时文件,然后将原始文件的内容写入临时文件的末尾(使用stream而不是将整个文件复制到variables中),然后将其删除原始文件并重命名临时文件以replace它。
注意:这个代码最初是基于Chao Xu现在已经不存在的博客文章。 该代码已经分歧,但原来的职位可以在Wayback机器中查看。
您可以使用以下代码在文件的开头和结尾附加文本。
$myFile = "test.csv";<br> $context = stream_context_create();<br> $fp = fopen($myFile, 'r', 1, $context);<br> $tmpname = md5("kumar");<br> //this will append text at the beginning of the file<br><br> file_put_contents($tmpname, "kumar");<br> file_put_contents($tmpname, $fp, FILE_APPEND);<br> fclose($fp);<br> unlink($myFile);<br> rename($tmpname, $myFile);<br><br> //this will append text at the end of the file<br> file_put_contents($myFile, "ajay", FILE_APPEND);
我想你可以做的是首先读取文件的内容并将其保存在一个临时variables中,现在将新数据插入到文件的开头,然后再附加临时variables的内容。
$ file = file_get_contents($ filename); $ content ='您的内容'。 $文件; file_put_contents($内容);
该代码logging文件开头的数据,以防止它们被覆盖。 接下来,它通过块重写文件块中存在的所有数据。
$data = "new stuff to insert at the beggining of the file"; $buffer_size = 10000; $f = fopen("database.txt", "r+"); $old_data_size = strlen($data); $old_data = fread($f, $old_data_size); while($old_data_size > 0) { fseek($f, SEEK_CUR, -$old_data_size); fwrite($f, $data); $data = $old_data; $old_data = fread($f, $buffer_size); $old_data_size = strlen($data); } fclose($f);
您可以使用fseek
来更改笔记中的指针。
必须注意的是,如果你使用fwrite
它会清除当前的内容。 所以基本上你必须读取整个文件,使用fseek
,编写新的内容,写入文件的旧数据。
$file_data = file_get_contents('database.txt') $fp = fopen('database.txt', 'a'); fseek($fp,0); fwrite($fp, 'new content'); fwrite($fp, $file_data); fclose($fp);
如果你的文件真的很大,你不想使用太多的内存,你可能需要两个文件的方法
$fp_source = fopen('database.txt', 'r'); $fp_dest = fopen('database_temp.txt', 'w'); // better to generate a real temp filename fwrite($fp_dest, 'new content'); while (!feof($fp_source)) { $contents .= fread($fp_source, 8192); fwrite($fp_dest, $contents); } fclose($fp_source); fclose($fp_dest); unlink('database.txt'); rename('database_temp.txt','database.txt');
Ben的解决scheme似乎比较直接,我认为。
最后一点:我不知道你在stock.txt中放置什么,但是你可以使用数据库服务器来更容易地做同样的事情。
- 以w +模式打开文件不是+模式。
- 获取要添加的文本的长度($ chunkLength)
- 如果需要,将文件光标设置到文件的开头
- 从文件中读取$ chunkLength个字节
- 返回游标到$ chunkLength * $ i;
- 写$ prepend
- 设置$ prepend从第4步的值
-
执行这些步骤,而EOF
$handler = fopen('1.txt', 'w+');//1 rewind($handler);//3 $prepend = "I would like to add this text to the beginning of this file"; $chunkLength = strlen($prepend);//2 $i = 0; do{ $readData = fread($handler, $chunkLength);//4 fseek($handler, $i * $chunkLength);//5 fwrite($handler, $prepend);//6 $prepend = $readData;//7 $i++; }while ($readData);//8 fclose($handler);
没有办法象你想的那样写入文件的开头。 这是我想由于操作系统和硬盘如何看到文件。 它有一个固定的开始和扩大结束。 如果你想在中间添加一些东西,或者需要一些滑动。 如果它是一个小文件,只读一遍,做你的操纵,并写回。 但是,如果没有,如果你总是添加到刚开始倒序行顺序,考虑结束为开始…
与使用fopen()
, fwrite()
和fclose()
函数相比, file_get_contents()
和file_put_contents()
使用更多的内存:
$fh = fopen($filename, 'a') or die("can't open file"); fwrite($fh, $fileNewContent); fclose($fh);