PHP - 读取文件


PHP 有许多选项可用于从使用 fopen() 函数打开的文件中读取数据。PHP 库中的以下内置函数可以帮助我们执行读取操作 -

  • fgets() − 从文件指针获取一行。
  • fgetc() − 从文件指针返回一个带有单个字符的字符串。
  • fread() − 从文件指针中读取指定数量的字节。
  • fscanf() − 从文件中读取数据并按照指定的格式进行解析。

fgets() 函数

fgets() 函数可以从打开的文件中返回一行。此函数停止返回指定长度或 EOF 的新行,以先到者为准,并在失败时返回 false


fgets(resource $stream, ?int $length = null): string|false

此处,$stream 参数是使用 fopen() 函数以读取或读/写模式打开的文件的文件指针或句柄,$length 是指定要读取的字节数的可选参数。

当读取 “length-1” 字节或遇到换行符时,读取操作结束,以先到者为准。

示例

以下代码从 “hello.txt” 文件中读取第一个可用行 -


<?php
   $file = fopen("hello.txt", "r");
   $str = fgets($file);
   echo $str;
   fclose($file);
?>

它将产生以下输出 -

Hello World

示例

您可以将 fgets() 函数放在一个循环中以读取文件,直到到达文件末尾。


<?php
   $file = fopen("hello.txt", "r");
   while(! feof($file)) {
      echo fgets($file). "<br>";
   }
   fclose($file);
?>

它将产生以下输出 -

Hello World
启科普在线教程
PHP 教程

在这里,我们使用了 feof() 函数,如果文件指针位于 EOF,则返回 true,否则返回 false

fgetc() 函数

fgetc() 函数返回从文件句柄的当前位置读取的单个字符。遇到 EOF 时,它将返回 false


 fgetc(resource $stream): string|false

此处,$stream 参数是使用 fopen() 函数以读取或读/写模式打开的文件的文件指针或句柄。

示例

以下代码显示从 “hello.txt” 文件中读取的第一个字符 −


<?php
   $file = fopen("hello.txt", "r");
   $str = fgets($file);
   echo $str;
   fclose($file);
?>

它将产生以下输出 -

H

示例

您还可以将 fgetc() 函数放在循环中,以逐个字符读取文件,直到它到达 EOF


<?php
   $file = fopen("hello.txt", "r");
   while(! feof($file)) {
      $char = fgetc($file);
      if ($char == "\n")
      echo "<br>";
      echo $char;
   }
   fclose($file);
?>

它将产生以下输出 -

Hello World
启科普在线教程
PHP 教程

fread() 函数

PHP 中的 fread() 函数是一个二进制安全函数,用于从文件中读取数据。fgets() 函数仅从文本文件中读取数据,而 fread() 函数可以在二进制模式下读取文件。


 fread(resource $stream, int $length): string|false

此处,$stream 参数是使用二进制读取或读/写模式( rb 或 rb+ )的 fopen() 函数打开的文件的文件指针或句柄。$length 参数指定要读取的字节数。

如果未给出 $length 参数,PHP 将尝试读取整个文件,直到达到 EOF,具体取决于指定的块大小。

示例

以下代码读取文本文件 -


<?php
   $name = "hello.txt";
   $file = fopen($name, "r");
   $data = fread($file, filesize($name));
   echo $data;
   fclose($file);
?>

它将产生以下输出 -

Hello World 启科普在线教程 PHP 教程

示例

您还可以读取非 ASCII 文件,例如以 rb 模式打开的图像文件。


<?php
   $name = "welcome.png";
   $file = fopen($name, "rb");
   $data = fread($file, filesize($name));
   var_dump($data);
   fclose($file);
?>

浏览器显示“var_dump”信息,如下所示 -

PHP 读取文件

fscanf() 函数

PHP fscanf() 函数从文件流中读取输入并根据指定的格式对其进行解析,从而将其转换为相应类型的变量。每次调用该函数都会从文件中读取一行。


 fscanf(resource $stream, string $format, mixed &...$vars): array|int|false|null

此处,$stream 参数是使用 fopen() 函数在读取模式下打开的文件的句柄。并且,$format 是包含以下一个或多个格式说明符的字符串 -

  • %% − 返回百分比
  • %b − 二进制数
  • %c − 根据 ASCII 值的字符
  • %f − 浮点数
  • %F − 浮点数
  • %o − 八进制数
  • %s − 字符串
  • %d − 带符号的十进制数
  • %e − 科学记数法
  • %u − 无符号十进制数
  • %x − 小写字母的十六进制数
  • %X − 大写字母的十六进制数

$vars 是一个可选参数,它通过引用指定变量,该变量将包含解析的值。

假设 “employees.txt” 文件位于下面给出的 PHP 脚本所在的同一目录中。文本文件的每一行都包含每个员工的 姓名、电子邮件、职位和薪水,以制表符分隔。

示例

以下 PHP 脚本使用 fscanf() 函数中的格式说明符读取文件 -


<?php
   $fp = fopen("employees.txt", "r");
   while ($employee_info = fscanf($fp, "%s\t%s\t%s\t%d\n")) {
      list ($name, $email, $post, $salary) = $employee_info;
      echo "<b>名字</b>: $name <b>电子邮箱</b>: 
      $email <b>薪水</b>: Rs. $salary <br>";
   }
   fclose($fp);
?>

它将产生以下输出 -

名字: Ravishankar 电子邮箱: ravi@gmail.com 薪水: 40000
名字: Kavita 电子邮箱: kavita@hotmail.com 薪水: 25000
名字: Nandkumar 电子邮箱: nandu@example.com 薪水: 30000