我对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);
}
提前欢呼
Steve
这没关系,但你做这件事的方式是错误的(至少"根本不正确")。如果到达文件末尾,fgets()
将返回false
,因此您应该改为针对false
进行测试。它对你有效,因为你使用";简单的";当与布尔值进行比较时,相等运算符(==
),即null
到false
的大小写。
返回从句柄指向的文件中读取的长度不超过1字节的字符串。如果文件指针中没有更多的数据可读取,则返回FALSE。
如果发生错误,则返回FALSE。
这意味着,它必须看起来像
while (($c = fgets($f)) !== false) {
doSomethingWith($c);
}
fgets
被记录为在没有更多数据可读取时返回false
。因此,技术上正确的解决方案是
// Notice the !== [non-identical] operator below
while (($c = fgets($f)) !== false) {
doSomethingWith($c);
}
这更好,因为fgets
可以合法地返回一个空(零长度)字符串,当使用相等运算符时,该字符串将与null
相比较。运算符!==
还检查其操作数的类型,因此通过这种方式可以覆盖您。