Почему это печатает последнюю строку? (SplFileObject)

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

Разве fgets () не переходит на следующую строку в файле? Если так, почему файл все еще передает второй оператор! $ File1-> eof ()? Это также происходит с -> valid ().

0

Решение

feof/SplFileObject :: ВФ проверить, находится ли дескриптор файла / поток в позиции EOF.
Ваш исходный файл имеет разрыв строки после последней строки данных, и fgets () останавливается тут же. Но позиция EOF — это, образно говоря, одна позиция после последней операции чтения. Так что следующий fgets () (и впоследствии read ()) вернет 0 байт и только затем файл находится в позиции EOF и feof () вернет true.
В вашем конкретном примере (nasdaqlisted.txt) может быть достаточно просто проверить, является ли $ data === » вместо $ file1-> eof (), поскольку в этом файле нет других строк emtpy.

1

Другие решения

Вы переопределяете $data каждый цикл времени работает. Попробуй это:
$data .= $file1->fgets();

-2

По вопросам рекламы [email protected]