feof() 實際上是可靠的。然而,您必須小心地將它與 fgets() 一起使用。一種常見的(但不正確的)方法是嘗試這樣做
<?
$fp = fopen("myfile.txt", "r");
while (!feof($fp)) {
$current_line = fgets($fp);
// 在此處處理目前行
}
fclose($fp);
?>
處理純文字檔時的問題是,在取得最後一行輸入後,feof() 不會返回 true。您需要嘗試取得輸入_並失敗_,feof() 才會返回 true。您可以將上面的迴圈想像成這樣工作
*(愉快地循環,取得行並處理它們)
* fgets 用於取得倒數第二行
* 處理該行
* 迴圈回到上方 -- feof 返回 false,所以執行迴圈內的步驟
* fgets 用於取得最後一行
* 處理該行
* 迴圈回到上方 -- 由於上次呼叫 fgets 成功(您取得了最後一行),feof 仍然返回 false,所以您再次執行迴圈內的步驟
* fgets 用於嘗試取得另一行(但沒有任何東西!)
* 您的程式碼沒有意識到這一點,並嘗試處理這個不存在的行(通常是再次執行相同的動作)
* 現在當您的程式碼迴圈回到上方時,feof 返回 true,您的迴圈結束
有兩種方法可以解決這個問題
1. 您可以在迴圈內放置一個額外的 feof() 測試
2. 您可以移動 fgets() 的呼叫位置,以便在更好的位置進行 feof() 的測試
以下是解決方案 1
<?
$fp = fopen("myfile.txt", "r");
while(!feof($fp)) {
$current_line = fgets($fp);
if (!feof($fp)) {
// 處理目前行
}
}
fclose($fp);
?>
以下是解決方案 2(恕我直言,更優雅)
<?
$fp = fopen("myfile.txt", "r");
$current_line = fgets($fp);
while (!feof($fp)) {
// 處理目前行
$current_line = fgets($fp);
}
fclose($fp);
?>
順帶一提,C++ 中的 eof() 函數的工作方式完全相同,所以這不僅僅是 PHP 的怪異之處...