PHP中的文件IO不起作用

P1n*_*u1n 2 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);
?>
Run Code Online (Sandbox Code Playgroud)

但这有效:

<?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);
?>
Run Code Online (Sandbox Code Playgroud)

当我关闭并重新打开文件时,我不知道它为何起作用.任何帮助,将不胜感激.

Bab*_*aba 8

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

fwrite() 将string的内容写入handle指向的文件流.

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

如果你看看 fread()

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

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

要解决此问题,只需使用fseek重新启动指针返回文件的开头即可

示例:

 fseek($handle, 0);
Run Code Online (Sandbox Code Playgroud)

你不需要关闭文件..你的第一个代码将完美地工作

编辑

您也可以为您倒带从PHP DOC

将句柄的文件位置指示符设置为文件流的开头.

 rewind($handle);
Run Code Online (Sandbox Code Playgroud)