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

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

4

2 回答 2

1

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

于 2015-12-27T13:43:13.683 回答
-2

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

于 2015-12-27T05:39:51.277 回答