【问题标题】:Is this an acceptable way to determine EOF while reading a file in PHP?这是在 PHP 中读取文件时确定 EOF 的可接受方法吗?
【发布时间】:2011-09-21 02:28:57
【问题描述】:

我对 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);
}

提前干杯

史蒂夫

【问题讨论】:

  • 谢谢戈登。使用该 SPL 方法是否更适合 PHP? (如果这是 Python,我会说,“这更 Pythonic 吗?” - 不确定这是否会转化为 PHP ...... Python 人有时似乎在应该如何做事和做事时有一根胡萝卜卡在某个地方Python 上的东西 :)
  • 没有。您可以同时使用两者。我只是发现 SPL 方式更方便、通用和可读。但这只是我。使用适合您的。

标签: php file null feof fgetc


【解决方案1】:

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

返回从句柄指向的文件中读取的最大长度为 1 个字节的字符串。如果文件指针中没有数据要读取,则返回 FALSE。

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

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

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

【讨论】:

  • 啊,感谢编辑...我将查找不同的相等运算符并更好地利用文档。如果它返回 false,那么我可以刚刚完成“while($c = fgets($f))”吗?干杯,史蒂夫
  • 也许吧。在这种情况下,我不建议这样做,因为这也会将其他所有内容都转换为布尔值(它与($c = fgets($f)) == true) 相同),这意味着0"" 将导致false。这里fgets() 也应该总是返回换行符,因此它应该工作,但我不会依赖它;)
  • 我刚刚阅读了文档 - 显然我不能按照我在上述评论中建议的那样做,因为 "0" 或 "" MAY 等同于错误.. . 所以我会坚持使用布尔相等运算符。再次感谢,你和乔恩让我指出了正确的方向......
【解决方案2】:

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

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

这更好,因为fgets 可以合法地返回一个空(零长度)字符串,当使用相等运算符时,它会比较等于null。运算符!== 还会检查其操作数的类型,这样你就被覆盖了。

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多