三大指針操作函數
| 函數 | 原型 | 作用 |
ftell() | int ftell(resource $handle) | 返回指針距文件開頭的字節偏移量 |
rewind() | bool rewind(resource $handle) | 將指針重置到文件開頭(偏移 0) |
fseek() | int fseek(resource $handle, int $offset [, int $whence = SEEK_SET]) | 移動指針到指定位置,支持相對/絕對定位 |
fseek() whence 參數詳解
| 常量 | 含義 | offset 範例 |
SEEK_SET | 從文件開頭計算(默認) | fseek($fp, 100) → 第 100 字節 |
SEEK_CUR | 從當前位置計算 | fseek($fp, 50, SEEK_CUR) → 向後 50 字節 |
SEEK_END | 從文件結尾計算 | fseek($fp, -100, SEEK_END) → 倒數 100 字節 |
返回值:成功返回 0,失敗返回 -1(如超出文件範圍)。
實戰演示:隨機讀取文件片段
<?php
$fp = fopen('data.txt', 'rb') or die("打開失敗");
echo "初始位置: " . ftell($fp) . "
"; // 0
// 讀取前 10 字節
echo "前10字節: " . fread($fp, 10) . "
";
echo "讀取後位置: " . ftell($fp) . "
"; // 10
// 相對當前位置 +100
fseek($fp, 100, SEEK_CUR);
echo "相對移動後: " . ftell($fp) . "
"; // 110
// 讀取 110-120 字節
echo "110-120: " . fread($fp, 10) . "
";
// 定位到倒數 10 字節
fseek($fp, -10, SEEK_END);
echo "最後10字節: " . fread($fp, 10) . "
";
// 重置到開頭
rewind($fp);
echo "重置後位置: " . ftell($fp) . "
"; // 0
fclose($fp);
?>
關鍵注意事項
- 追加模式(
a/a+)寫入時忽略指針位置,數據總寫入文件末尾
- 文本模式(無
b)下 fseek() 偏移量可能因換行符轉換不準確,二進制模式下精確
SEEK_END 配合負 offset 實現「讀取文件尾部」
- 網絡流(HTTP/FTP)通常不支持
fseek(),僅本地文件有效
應用場景
- 大文件斷點續傳(記錄已下載偏移量)
- 日誌文件尾部實時追蹤(
tail -f 效果)
- 二進制文件結構解析(跳過 Header 讀取 Body)
- 隨機訪問固定長度記錄(如簡易數據庫)