PHP中feof()函数的猜测
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()循环:
= ( (!(
= ( }
经过测试,似乎前一种方法效率会高一些。
PHP之友评论