首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 逐字符讀取文件內容:while + feof() + fgetc() 完整範例與注意事項

     編輯:PHP 相關知識

核心代碼

<?php
$filePath = '/Users/Cuffica/Desktop/addicted.rtf'; // 替換為實際路徑

// 1. 以只讀模式打開文件,返回資源句柄
$fp = fopen($filePath, 'r');
if ($fp === false) {
    die("無法打開文件:{$filePath}");
}

// 2. 循環讀取:feof() 檢測指針是否到達文件末尾
while (!feof($fp)) {
    // fgetc() 參數是「句柄」而非文件名,每次讀取 1 個字符
    $char = fgetc($fp);
    if ($char !== false) {
        echo $char;
    }
}

// 3. 關閉句柄釋放資源
fclose($fp);
?>

關鍵函數解析

函數說明
fopen(path, 'r')打開文件,返回資源句柄;'r' 為只讀模式,指針指向開頭。
feof(handle)檢查文件指針是否在 EOF(End Of File)位置,到達末尾返回 true。
fgetc(handle)從句柄讀取**單個字符**(含換行符),指針後移 1 位;失敗或 EOF 返回 false。
fclose(handle)關閉文件句柄,**務必調用**,否則佔用系統文件描述符導致洩漏。

常見坑點與最佳實踐

  1. 編碼問題:fgetc 按位元組讀取。若文件為 UTF-8 中文(每字 3 位元組),直接輸出會導致亂碼。建議改用 fgets() 按行讀取,或讀取整體內容後用 mb_convert_encoding 處理。
  2. 大文件效能:逐字符讀取系統調用開銷極大。實際專案中,**優先使用**:
    • file_get_contents() — 小文件一次性讀入記憶體
    • fgets() / fread() — 大文件分塊/按行讀取
    • SplFileObject — 面向對象封裝,支援迭代器模式逐行處理
  3. 錯誤處理:永遠檢查 fopen 返回值;生產環境建議包裝 try-catch 或設置錯誤處理器。
  4. 二進制安全:讀取圖片、PDF 等二進制文件時,模式用 'rb',輸出前發送正確 Content-Type 標頭。

進階範例:大文件分塊讀取(記憶體友好)

<?php
$fp = fopen('huge.log', 'rb');
if ($fp) {
    while (!feof($fp)) {
        $chunk = fread($fp, 8192); // 每次讀 8KB
        if ($chunk === false) break;
        // 處理 $chunk,如寫入另一文件、解析日志、發送網絡流等
        process_chunk($chunk);
    }
    fclose($fp);
}
?>

總結

while(!feof($fp)) { fgetc($fp); } 是 PHP 文件讀取最基礎的教學範例,理解「句柄、指針、EOF」三大概念至關重要。實際開發中,請根據文件大小、編碼、處理邏輯選擇更高層級的 API(file()、SplFileObject、流過濾器等),寫出更健壯、高效的代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved