2

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

当我关闭并重新打开文件时,我不明白为什么它会起作用。任何帮助,将不胜感激。

4

2 回答 2

8

您只需要重新启动文件指针,因为使用时fwrite()

fwrite()将字符串的内容写入句柄指向的文件流。

  • 已读取长度字节
  • 到达 EOF(文件结尾)
  • 数据包可用或发生套接字超时(对于网络流)
  • 如果流被读取缓冲并且它不代表普通文件,则最多读取一次最多等于块大小(通常为 8192)的字节数;根据之前缓冲的数据,返回数据的大小可能会大于块大小。

如果你看fread()

fread()从句柄引用的文件指针中读取最多长度字节。只要满足以下条件之一,读取就会停止:

因此,在您打电话时,fread($handle, filesize($filename));您已经在文件末尾,因此不会显示任何内容。

要解决这个问题,只需使用fseek重新启动指针回到文件的开头

例子 :

 fseek($handle, 0);

你不需要关闭文件..你的第一个代码可以完美运行

编辑

你也可以从 PHP DOC倒带

将句柄的文件位置指示器设置为文件流的开头。

 rewind($handle);
于 2012-12-04T14:49:50.520 回答
-2

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

于 2012-12-04T14:48:59.840 回答