这是在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);
}

提前欢呼

Steve

这没关系,但你做这件事的方式是错误的(至少"根本不正确")。如果到达文件末尾,fgets()将返回false,因此您应该改为针对false进行测试。它对你有效,因为你使用";简单的";当与布尔值进行比较时,相等运算符(==),即nullfalse的大小写。

返回从句柄指向的文件中读取的长度不超过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相比较。运算符!==还检查其操作数的类型,因此通过这种方式可以覆盖您。

相关文章: