Непонятный нюанс while(!atEnd()), не доходит до конца файла |
Здравствуйте, гость ( Вход | Регистрация )
Непонятный нюанс while(!atEnd()), не доходит до конца файла |
NordWest |
29.9.2010, 11:37
Сообщение
#1
|
Студент Группа: Участник Сообщений: 86 Регистрация: 26.11.2008 Пользователь №: 433 Спасибо сказали: 1 раз(а) Репутация: 0 |
Сейчас в конкретном примере показать не смогу, но пару раз встречался. Вобщем то в том и дело, что снова пишу подобный код и не могу вспомнить правильный вариант.
Ситуация такая. Построчное считывание из текстового файла. Код примерно такой: CODE QFile pnFile(plnFileName); pnFile.open(QIODevice::ReadOnly | QIODevice::Text); QTextStream pnStream(&pnFile); while(!pnStream.atEnd()) { ... } В цикле происходит считывание из pnStream текстовых строк. Проблема в том, что иногда цикл завершается на половине файла. И зависит это от того, что стоит в while. В примере один случай, а можно написать while(!pnFile.atEnd()). И в одном из вариантов будет всё в порядке, а в другом нет и файл не будет считан до конца. Может быть я каких-то нюансов не учёл, а они важны. Я это случайно заметил, когда обнаружил уж очень большую недостачу данных. Может тут какое-то явное правило существует?.. Сообщение отредактировал NordWest - 29.9.2010, 11:45 |
|
|
kwisp |
29.9.2010, 12:36
Сообщение
#2
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
Цитата 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
Сообщение
#3
|
Студент Группа: Участник Сообщений: 86 Регистрация: 26.11.2008 Пользователь №: 433 Спасибо сказали: 1 раз(а) Репутация: 0 |
Нет, не оттуда. Обычные текстовые файлы, в той же папке, что и программа. Это не устройства и не процессы. Я с такими ещё не связывался. А у обычных файлов странно получить ситуацию, когда его длинна изменилась за время считывания. Если я правильно интерпретирую.
Т.е. предпочтительнее использовать QTextStream::atEnd () ? |
|
|
Litkevich Yuriy |
29.9.2010, 13:22
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
NordWest, есть же готовый пример в документации, зачем гадать.
|
|
|
NordWest |
29.9.2010, 13:59
Сообщение
#5
|
Студент Группа: Участник Сообщений: 86 Регистрация: 26.11.2008 Пользователь №: 433 Спасибо сказали: 1 раз(а) Репутация: 0 |
Этот?
Т.е. вообще по QString определять? |
|
|
Litkevich Yuriy |
29.9.2010, 16:21
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
NordWest |
29.9.2010, 17:08
Сообщение
#7
|
Студент Группа: Участник Сообщений: 86 Регистрация: 26.11.2008 Пользователь №: 433 Спасибо сказали: 1 раз(а) Репутация: 0 |
Конец файла конечно. Ведь в том смысл.
|
|
|
Litkevich Yuriy |
29.9.2010, 17:13
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
я такой код использовал в нескольких программах и даже не задумывался о другом варианте.
|
|
|
Текстовая версия | Сейчас: 21.12.2024, 13:50 |