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
TutorialsPoint
PHP Tutorials

这里,我们使用了 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
TutorialsPoint
PHP Tutorials

fread() 函数

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

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

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

如果没有给出 $length 参数,PHP 会尝试读取整个文件,直到到达 EOF,受指定的分块大小限制。

示例

以下代码读取一个文本文件:

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

它将产生以下输出

Hello World TutorialsPoint PHP Tutorials

示例

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

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

浏览器将 "var_dump" 信息显示为:

PHP Read File

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>Name</b>: $name <b>Email</b>: 
	  $email <b>Salary</b>: Rs. $salary <br>";
   }
   fclose($fp);
?>

它将产生以下输出

Name: Ravishankar Email: [email protected] Salary: Rs. 40000
Name: Kavita Email: [email protected] Salary: Rs. 25000
Name: Nandkumar Email: [email protected] Salary: Rs. 30000
广告