【问题标题】:Why does this print the last line? (SplFileObject)为什么这会打印最后一行? (SplFileObject)
【发布时间】:2015-12-27 03:21:04
【问题描述】:
$file1 = new \SplFileObject('some file');
while( !$file1->eof() ){
    $data = $file1->fgets();
    if( !$file1->eof() ){
       echo $data;
    }
}

fgets() 不会跳到文件的下一行吗?如果是这样,为什么文件仍然通过第二个 !$file1->eof() 语句?这也发生在 ->valid() 中。

【问题讨论】:

  • 3v4l.org/clqTE - 你期望什么输出?
  • 这是我所期望的,但我一直在尝试的文件仍然运行最后一行。这是有问题的文件:ftp.nasdaqtrader.com/SymbolDirectory/nasdaqlisted.txt
  • File Creation Time: 1224201521:32||||| 后面有一个换行符(实际上是 0x0d 0x0A)。 fgets() 停止读取 exactly 那里。但是 eof() 测试文件指针是否位于 EOF 位置,这形象地说是在最后一次读取操作之后的一个位置。对 fgets() 的下一次调用(以及随后的 read())将返回 0 个字节,然后文件句柄/流位于 EOF 位置。
  • 伙计,我应该检查一下。不知道为什么我没有想到这一点,一直在扯我的头发。如果可以的话,把它作为这个问题的答案。

标签: php spl splfileobject


【解决方案1】:

feof/SplFileObject::eof 测试文件句柄/流是否在EOF位置。
您的源文件在最后一个数据行之后有一个换行符,并且 fgets() 就停在那里。但是 EOF 位置形象地说是在最后一次读取操作之后的一个位置。因此,下一个 fgets()(以及随后的 read())将返回 0 个字节,并且只有 然后 文件位于 EOF 位置并且 feof() 将返回 true。
在您的具体示例(nasdaqlisted.txt)中,仅测试 $data 是否为 ==='' 而不是 $file1->eof() 可能就足够了,因为该文件中似乎没有其他空行。

【讨论】:

    【解决方案2】:

    每次循环运行时,您都会覆盖 $data。试试这个: $data .= $file1->fgets();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 2020-05-19
      • 2017-12-25
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      相关资源
      最近更新 更多