对于学校作业,我必须用PHP编写脚本。它必须创建一个带有名称的数组,并将数组写入文件。然后它必须删除数组,读取文件中的名称并回显它们。
这不起作用:
<?php
$names = array("Name 1", "Name 2", "Name 3", "Name 4", "Name 5");
$filename = "names.txt";
$handle = fopen($filename, "wb+"); //open as read and write
$string = implode("\r\n", $names); //name on each line
fwrite($handle, $string); //write line
$names = array(); //empty array
print_r($names); //print empty array
$string = fread($handle, filesize($filename)); //read file
$names = explode("\r\n", $string); //lines to array
foreach ($names as $name) {
echo("<br>\n$name");
}
fclose($handle);
?>
但这有效:
<?php
$names = array("Name 1", "Name 2", "Name 3", "Name 4", "Name 5");
$filename = "names.txt";
$handle = fopen($filename, "wb"); //open as write
$string = implode("\r\n", $names); //name on each line
fwrite($handle, $string); //write line
fclose($handle); //close
$handle = fopen($filename, "r"); //open as read
$names = array(); //empty array
print_r($names); //print empty array
$string = fread($handle, filesize($filename)); //read file
$names = explode("\r\n", $string); //lines to array
foreach ($names as $name) {
echo("<br>\n$name");
}
fclose($handle);
?>
当我关闭并重新打开文件时,我无法理解它的工作原理。任何帮助将不胜感激。
答案 0 :(得分:8)
您需要的是重启文件指针,因为使用fwrite()
时:
fwrite()
将string的内容写入handle指向的文件流。
- 已读取长度字节
- 到达EOF(文件结尾)
- 数据包可用或发生套接字超时(对于网络流)
- 如果流被读缓冲并且它不表示普通文件,则最多读取一个等于块大小(通常为8192)的字节数;根据以前缓冲的数据,返回数据的大小可能大于块大小。
如果你看fread()
fread()
从句柄引用的文件指针读取长度字节。只要满足these conditions之一,阅读就会停止:
因此,当您致电fread($handle, filesize($filename));
时,您已经在文件末尾,因此不会显示任何内容。
要解决此问题,只需使用fseek
将指针重新启动回文件的开头
示例:
fseek($handle, 0);
您不需要关闭文件..您的第一个代码将完美运行
修改
您也可以从PHP DOC <{3}}获取
将句柄的文件位置指示符设置为文件流的开头。
rewind($handle);
答案 1 :(得分:-2)
第二个脚本是正确的。原因是如果你打开一个文件进行写作,就不能用来阅读,所以你必须关闭文件并在阅读时重新打开它。