Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Непонятный нюанс while(!atEnd())

Автор: NordWest 29.9.2010, 11:37

Сейчас в конкретном примере показать не смогу, но пару раз встречался. Вобщем то в том и дело, что снова пишу подобный код и не могу вспомнить правильный вариант.
Ситуация такая. Построчное считывание из текстового файла. Код примерно такой:

CODE
QFile pnFile(plnFileName);
pnFile.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream pnStream(&pnFile);

while(!pnStream.atEnd())
{
...
}


В цикле происходит считывание из pnStream текстовых строк. Проблема в том, что иногда цикл завершается на половине файла. И зависит это от того, что стоит в while. В примере один случай, а можно написать while(!pnFile.atEnd()). И в одном из вариантов будет всё в порядке, а в другом нет и файл не будет считан до конца. Может быть я каких-то нюансов не учёл, а они важны. Я это случайно заметил, когда обнаружил уж очень большую недостачу данных. Может тут какое-то явное правило существует?..

Автор: kwisp 29.9.2010, 12:36

Цитата
bool QIODevice::atEnd () const [virtual]
Returns true if the current read and write position is at the end of the device (i.e. there is no more data available for reading on the device); otherwise returns false.

For some devices, atEnd() can return true even though there is more data to read. This special case only applies to devices that generate data in direct response to you calling read() (e.g., /dev or /proc files on Unix and Mac OS X, or console input / stdin on all platforms).

See also bytesAvailable(), read(), and isSequential().


Цитата
bool QTextStream::atEnd () const
Returns true if there is no more data to be read from the QTextStream; otherwise returns false. This is similar to, but not the same as calling QIODevice::atEnd(), as QTextStream also takes into account its internal Unicode buffer.


что за файл читаешь? не из /dev или /proc случаем?

Автор: NordWest 29.9.2010, 13:09

Нет, не оттуда. Обычные текстовые файлы, в той же папке, что и программа. Это не устройства и не процессы. Я с такими ещё не связывался. А у обычных файлов странно получить ситуацию, когда его длинна изменилась за время считывания. Если я правильно интерпретирую.
Т.е. предпочтительнее использовать QTextStream::atEnd () ?

Автор: Litkevich Yuriy 29.9.2010, 13:22

NordWest, есть же http://doc.crossplatform.ru/qt/4.6.x/qtextstream.html#details, зачем гадать.

Автор: NordWest 29.9.2010, 13:59

Этот?

QTextStream stream(stdin);
QString line;
do {
     line = stream.readLine();
} while (!line.isNull());


Т.е. вообще по QString определять?

Автор: Litkevich Yuriy 29.9.2010, 16:21

Цитата(NordWest @ 29.9.2010, 17:59) *
Т.е. вообще по QString определять?
что определять?

Автор: NordWest 29.9.2010, 17:08

Конец файла конечно. Ведь в том смысл.

Автор: Litkevich Yuriy 29.9.2010, 17:13

я такой код использовал в нескольких программах и даже не задумывался о другом варианте.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)