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()循環:
= ( (!(
= ( }
經過測試,似乎前一種方法效率會高一些。