为什么要打印最后一行? (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() 不会进入文件中的下一行吗?如果是这样,为什么文件仍然通过第二个 !$file1->eof() 语句?这也发生在 ->valid() 中。
每次循环运行时,您都会覆盖 $data
。试试这个:
$data .= $file1->fgets();
feof/SplFileObject::eof测试文件handle/stream是否在EOF位置
您的源文件在最后一个数据行之后有一个换行符, fgets() 就在那里停止。但是EOF的位置形象地说就是最后一次读操作之后的一个位置。所以下一个 fgets() (以及随后的 read())将 return 0 字节并且只有 然后 文件位于 EOF 位置并且 feof() 将 return 是的。
在您的具体示例 (nasdaqlisted.txt) 中,仅测试 $data 是否 ==='' 而不是 $file1->eof() 可能就足够了,因为该文件中似乎没有其他空行。
$file1 = new \SplFileObject('some file');
while( !$file1->eof() ){
$data = $file1->fgets();
if( !$file1->eof() ){
echo $data;
}
}
fgets() 不会进入文件中的下一行吗?如果是这样,为什么文件仍然通过第二个 !$file1->eof() 语句?这也发生在 ->valid() 中。
每次循环运行时,您都会覆盖 $data
。试试这个:
$data .= $file1->fgets();
feof/SplFileObject::eof测试文件handle/stream是否在EOF位置
您的源文件在最后一个数据行之后有一个换行符, fgets() 就在那里停止。但是EOF的位置形象地说就是最后一次读操作之后的一个位置。所以下一个 fgets() (以及随后的 read())将 return 0 字节并且只有 然后 文件位于 EOF 位置并且 feof() 将 return 是的。
在您的具体示例 (nasdaqlisted.txt) 中,仅测试 $data 是否 ==='' 而不是 $file1->eof() 可能就足够了,因为该文件中似乎没有其他空行。