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

PHP 檔案讀寫函式對比:fgets/fputs 逐行 vs fread/fwrite 區塊 (第 1/2 部分)

     編輯:PHP 綜合知識

逐行讀寫:fgets / fputs

// 讀取一行 (最多 n-1 字元,遇換行或 EOF 停止)
$line = fgets($fp, 1024);

// 寫入字串
fputs($fp, "內容\n");
  • 適合文字檔、日誌、CSV 等行導向資料。
  • 自動處理換行符,記憶體佔用低 (逐行)。
  • fgets() 回傳包含換行符的字串;fputs() 相當於 fwrite() 但不需指定長度。

區塊讀寫:fread / fwrite

// 讀取指定位元組數
$data = fread($fp, 8192); // 讀 8KB

// 寫入指定位元組數
fwrite($fp, $binaryData, strlen($binaryData));
  • 適用二進位檔 (圖片、壓縮檔)、固定長度記錄、結構體序列化。
  • 不解析換行,純位元組流操作。
  • 需自行控制讀寫長度與位移。

模式旗標提醒

模式說明
r/w/a文字模式 (Windows 會轉換 \n↔\r\n)
rb/wb/ab二進位模式 (不轉換),跨平台一致

處理二進位檔案務必加 b 旗標 (如 fopen($file, 'rb'))。

範例:結構體陣列寫入/讀出 (C 風格)

$fp = fopen("stu_list", "wb+");
$students = [
    ['name'=>'Alice','num'=>1,'age'=>20,'addr'=>'Taipei'],
    ['name'=>'Bob',  'num'=>2,'age'=>21,'addr'=>'Taichung'],
];
foreach ($students as $s) {
    // 簡易序列化:固定長度欄位
    $rec = pack("a10 i i a15", $s['name'], $s['num'], $s['age'], $s['addr']);
    fwrite($fp, $rec);
}
rewind($fp);
while ($rec = fread($fp, 37)) { // 10+4+4+15+4(padding) = 37
    $u = unpack("a10name/inum/iage/a15addr", $rec);
    echo "{$u['name']} {$u['num']} {$u['age']} {$u['addr']}\n";
}
fclose($fp);

結語

fgets/fputs 適合行導向文字處理;fread/fwrite 適合二進位與固定結構資料。選擇正確模式與函式組合,能簡化邏輯並提升效能。

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