Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятный нюанс while(!atEnd())
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
NordWest
Сейчас в конкретном примере показать не смогу, но пару раз встречался. Вобщем то в том и дело, что снова пишу подобный код и не могу вспомнить правильный вариант.
Ситуация такая. Построчное считывание из текстового файла. Код примерно такой:

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

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


В цикле происходит считывание из pnStream текстовых строк. Проблема в том, что иногда цикл завершается на половине файла. И зависит это от того, что стоит в while. В примере один случай, а можно написать while(!pnFile.atEnd()). И в одном из вариантов будет всё в порядке, а в другом нет и файл не будет считан до конца. Может быть я каких-то нюансов не учёл, а они важны. Я это случайно заметил, когда обнаружил уж очень большую недостачу данных. Может тут какое-то явное правило существует?..
kwisp
Цитата
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
Нет, не оттуда. Обычные текстовые файлы, в той же папке, что и программа. Это не устройства и не процессы. Я с такими ещё не связывался. А у обычных файлов странно получить ситуацию, когда его длинна изменилась за время считывания. Если я правильно интерпретирую.
Т.е. предпочтительнее использовать QTextStream::atEnd () ?
Litkevich Yuriy
NordWest, есть же готовый пример в документации, зачем гадать.
NordWest
Этот?
QTextStream stream(stdin);
QString line;
do {
     line = stream.readLine();
} while (!line.isNull());


Т.е. вообще по QString определять?
Litkevich Yuriy
Цитата(NordWest @ 29.9.2010, 17:59) *
Т.е. вообще по QString определять?
что определять?
NordWest
Конец файла конечно. Ведь в том смысл.
Litkevich Yuriy
я такой код использовал в нескольких программах и даже не задумывался о другом варианте.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2022 IPS, Inc.