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: ravi@gmail.com Salary: Rs. 40000
Name: Kavita Email: kavita@hotmail.com Salary: Rs. 25000
Name: Nandkumar Email: nandu@example.com Salary: Rs. 30000
廣告