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

fgets() はファイルの次の行に進みませんか? もしそうなら、なぜファイルはまだ 2 番目の !$file1->eof() ステートメントを渡すのですか? これは ->valid() でも発生します。

4

2 に答える 2

1

feof / SplFileObject::eofは、ファイル ハンドル/ストリームが EOF 位置にあるかどうかをテストします。
ソース ファイルには最後のデータ行の後に改行があり、fgets() はそこで停止します。ただし、EOF 位置は、最後の読み取り操作の 1 つ後の位置を比喩的に表しています。SO 次の fgets() (およびその後の read()) は 0 バイトを返し、ファイルが EOF 位置にある場合にのみ、feof() は true を返します。
具体的な例 (nasdaqlisted.txt) では、そのファイルに他の空の行がないように見えるため、 $file1->eof() の代わりに $data が ==='' であるかどうかをテストするだけで十分かもしれません。

于 2015-12-27T13:43:13.683 に答える
-2

$dataループが実行されるたびにオーバーライドしています。これを試して: $data .= $file1->fgets();

于 2015-12-27T05:39:51.277 に答える