PHP中的文件IO不起作用

时间:2012-12-04 14:45:17

标签: php file-io

对于学校作业,我必须用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);
?>

当我关闭并重新打开文件时,我无法理解它的工作原理。任何帮助将不胜感激。

2 个答案:

答案 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)

第二个脚本是正确的。原因是如果你打开一个文件进行写作,就不能用来阅读,所以你必须关闭文件并在阅读时重新打开它。