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

这是在PHP中读取文件时确定EOF的一种可接受的方法吗?,php,file,null,feof,fgetc,Php,File,Null,Feof,Fgetc,我对PHP相当陌生,只是尝试转换我在C中所做的一些事情。我学习的从C中读取文件的习惯用法是: while ((c = getchar()) != EOF) { doSomethingWith(c); } 我读了一些书,似乎在PHP中实现这一点的“正确”方法是: while (!feof($file)) { $c = fgetc($file); doSomethingWith($c); } 我的问题是:是否可以按如下方式将两者结合起来(我已经尝试过了,并且在我的测试文件

我对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);
}
提前欢呼


史蒂夫

没关系,但你的做法是错误的(至少“根本不正确”)。如果到达文件末尾,则返回
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
进行比较。操作员
==还检查其操作数的类型,这样就可以覆盖您。

啊,感谢您的编辑。。。我将查找不同的相等运算符并更好地利用文档。如果它返回false,那么我是否可以执行“while($c=fgets($f))”?干杯,史蒂文。在这种情况下,我不建议这样做,因为这会将其他所有内容也转换为布尔值(它与
($c=fgets($f))==true)
),这意味着
0
将导致
false
。这里的
fgets()
也应该始终返回换行符,因此它应该可以工作,但我不会依赖它;)我只是阅读了文档-显然我不能按照我在上面的评论中所建议的那样做,因为“0”或“0”可能等同于错误的。。。所以我将继续使用布尔等式运算符。再次感谢,你和乔恩为我指明了正确的方向…(提示)谢谢戈登。使用SPL方法更正确吗?(如果这是Python,我会说,“这更像Python吗?”-不确定这是否会转化为PHP…Python人有时似乎在事情应该如何做以及以pythonical的方式做事情时遇到了麻烦:)不,两者都可以使用。我只是觉得SPL方式更方便、更通用、更可读。但那只是我。使用适合你的东西。