为什么打印最后一行? (SplFileObject)

时间:2015-12-27 03:21:05

标签: php spl splfileobject

$file1 = new \SplFileObject('some file');
while( !$file1->eof() ){
    $data = $file1->fgets();
    if( !$file1->eof() ){
       echo $data;
    }
}

不是fgets()步骤到文件的下一行吗?如果是这样,为什么文件仍然传递第二个!$ file1-> eof()语句?使用 - > valid()也会发生这种情况。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-2)

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