这是在 PHP 中读取文件时确定 EOF 的可接受方法吗?

Is this an acceptable way to determine EOF while reading a file in PHP?

提问人:Steve 提问时间:6/23/2011 更新时间:6/23/2011 访问量:2402

问:

我对PHP相当陌生,只是想转换我在C中所做的一些事情。我学到的用 C 语言从文件中读取的成语是:

while ((c = getchar()) != EOF) {
    doSomethingWith(c);
}

我已经做了一些阅读,似乎在PHP中执行此操作的“正确”方法是:

while (!feof($file)) {
    $c = fgetc($file);
    doSomethingWith($c);
}

我的问题是:是否可以将两者组合如下(我已经尝试过,并且它在我的测试文件上工作正常),或者是否在某些情况下可以在 EOF 之前找到 null?

while (($c = fgets($f)) != null) {
    doSomethingWith($c);
}

提前干杯

史蒂夫

php 文件 null feof fgetc

评论

0赞 Gordon 6/23/2011
(提示) 使用 Spl 迭代文件内容
0赞 Steve 6/24/2011
谢谢戈登。使用该 SPL 方法是否更符合 PHP 正确?(如果这是 Python,我会说,“这更像 Python 吗?”——不确定这是否转化为 PHP......Python 人有时似乎在某个地方卡了一根胡萝卜,当涉及到应该如何做事和以 Python 方式做事时:)
0赞 Gordon 6/24/2011
不。您可以同时使用两者。我只是觉得 SPL 方式更方便、更通用、更易读。但那只是我。使用适合您的。

答:

2赞 KingCrunch 6/23/2011 #1

没关系,但你这样做的方式是错误的(至少“根本不正确”)。fgets() 返回 ,如果到达文件末尾,则应改为测试。它对你有用,因为你使用“简单”相等运算符 (),当与布尔值进行比较时,它将写成 。falsefalse==nullfalse

返回一个长度不超过 1 个字节的字符串,从句柄指向的文件中读取。如果文件指针中没有要读取的更多数据,则返回 FALSE。

如果发生错误,则返回 FALSE。

这意味着,它必须看起来像

while (($c = fgets($f)) !== false) {
    doSomethingWith($c);
}

评论

0赞 Steve 6/23/2011
啊,感谢编辑......我将查找不同的相等运算符并更好地利用文档。如果它返回 false,那么我可以只做“while($c = fgets($f))”吗?干杯,史蒂夫
0赞 KingCrunch 6/23/2011
或。在这种情况下,我不建议这样做,因为这会将其他所有内容也转换为布尔值(它与 相同),这意味着,that 和 将导致 .这里也应该始终返回换行符,因此它应该有效,但我不会依赖它;)($c = fgets($f)) == true)0""falsefgets()
0赞 Steve 6/23/2011
我刚刚阅读了文档 - 显然我不能按照我在上面的评论中建议的那样做,因为“0”或“”可能等同于错误......所以我会坚持使用布尔相等运算符。再次感谢,你和乔恩让我指明了正确的方向......
0赞 Jon 6/23/2011 #2

fgets被记录为在没有更多数据要读取时返回。因此,技术上正确的解决方案是false

// Notice the !== [non-identical] operator below
while (($c = fgets($f)) !== false) {
    doSomethingWith($c);
}

这更好,因为可以合法地返回一个空(零长度)字符串,该字符串与使用相等运算符时相等。操作员还会检查其操作数的类型,因此这样您就可以被覆盖。fgetsnull!==