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


Why does this print the last line? (SplFileObject)

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

fgets(( 不会步入文件中的下一行吗?如果是这样,为什么文件仍然传递第二个 !$file 1->eof(( 语句?这也发生在 ->valid(( 中。

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

每次

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