实际上,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 特性...