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