10.8.45.3.15
PHP的官方手冊中,函數feof()下面的討論不少,對此做了一些相關的測試。
<? <<< <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>測試PHP中的feof()函數效果</title> </head> <body> <div> bool2str( ( == "TRUE" } "FALSE" = './7bytesfile' = (, 'r' (! ("文件打開失敗" ( = 0; <= (); ++ (, "文件位置" . () . ":<br />\n" "執行fseek,尚未執行讀取操作之前,feof結果:" . bool2str(()) . "<br />\n" "當前位置字符:" . () . "<br />\n" "執行文件讀取操作之後,feof結果:" . bool2str(()) . "<hr />\n" "ftell()結果:". (). "<hr />\n" (, 4 "文件位置" . () . ":<br />\n" "執行fseek,尚未執行讀取操作之前,feof結果:" . bool2str(()) . "<br />\n" "當前位置字符:" . () . "<br />\n" "執行文件讀取操作之後,feof結果:" . bool2str(()) . "<hr />\n" (, 7 "文件位置" . () . ":<br />\n" "執行fseek,尚未執行讀取操作之前,feof結果:" . bool2str(()) . "<br />\n" "當前位置字符:" . () . "<br />\n" "執行文件讀取操作之後,feof結果:" . bool2str(()) . "<hr />\n" ( = (, 'r' (! ("文件打開失敗" (!( = ( ( === 'FALSE' } ( <<< </div> </body> </html> ?>
針對這種情況的猜測是,在PHP中,feof()的實現方式並非直接檢查文件指針相對於文件的位置,而是根據某個標識返回結果。每次fseek()之後都會都會把這個標識設置為“False”,只有當執行一次文件內容讀取操作之後,才會根據文件讀取的結果對標識進行設置。
根據這種猜測,可以使用兩種代碼邏輯。
一個方法是不做feof()檢測,直接檢測內容讀取函數(比如fgetc()、fgets())的執行結果。
(( = ( }
這種處理辦法,利用了PHP被诟病的函數返回方式,所以得用“===”或“!==”進行檢測,不能把代碼簡化成:
( = ()) {}
另外一個方法是先進行一次文件讀取,然後再進入feof()循環:
= ( (!( = ( }
經過測試,似乎前一種方法效率會高一些。