提问人:Steve 提问时间:6/23/2011 更新时间:6/23/2011 访问量:2402
这是在 PHP 中读取文件时确定 EOF 的可接受方法吗?
Is this an acceptable way to determine EOF while reading a file in PHP?
问:
我对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);
}
提前干杯
史蒂夫
答:
2赞
KingCrunch
6/23/2011
#1
没关系,但你这样做的方式是错误的(至少“根本不正确”)。fgets()
返回 ,如果到达文件末尾,则应改为测试。它对你有用,因为你使用“简单”相等运算符 (),当与布尔值进行比较时,它将写成 。false
false
==
null
false
返回一个长度不超过 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
""
false
fgets()
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);
}
这更好,因为可以合法地返回一个空(零长度)字符串,该字符串与使用相等运算符时相等。操作员还会检查其操作数的类型,因此这样您就可以被覆盖。fgets
null
!==
评论