Бесконечное чтение из потока, не определяется EOF
От: jek_  
Дата: 15.09.06 06:53
Оценка:
Использую тривиальную связку std::ifstream + boost::archive::binary_iarchive, чтобы читать записи из файла.

while(...) {
   if(is.bad() || is.eof() || is.fail() || !is.good()) {
     std::cout << "read ended" << std::endl;
     break;
   }

   ia >> record;

   std::cout << "Pos: " << is.tellg() << std::endl;
}


Всё читается замечательно, но! — бесконечно! Т.е. когда файл по идее кончается, ни одно из условий в if-е не проваливается, но is.tellg() начинает всегда возвращать одно и то же число, и читается одна и та же мусорная запись. Предшествующие записи вполне нормальные и содержат правильные данные.

Ничего не понимаю... У меня MSVC 2005, Boost 1.34. Трассировка кишков буста и MS STL ничего не дали, там сильно вложенный и сложный код.

Помогите, кто с таким сталкивался.
Заранее спасибо.
Re: Бесконечное чтение из потока, не определяется EOF
От: MaximE Великобритания  
Дата: 15.09.06 07:45
Оценка:
jek_ wrote:
> Использую тривиальную связку std::ifstream +
> boost::archive::binary_iarchive, чтобы читать записи из файла.
>
> while(...) {
>    if(is.bad() || is.eof() || is.fail() || !is.good()) {
>      std::cout << "read ended" << std::endl;
>      break;
>    }
> 
>    ia >> record;
> 
>    std::cout << "Pos: " << is.tellg() << std::endl;
> }


Обычно достаточно while(is)/if(is)

> Всё читается замечательно, но! — бесконечно! Т.е. когда файл по идее

> кончается, ни одно из условий в if-е не проваливается, но is.tellg()
> начинает всегда возвращать одно и то же число, и читается одна и та же
> мусорная запись. Предшествующие записи вполне нормальные и содержат
> правильные данные.

Используешь std::ifstream или std::basic_ifstream<unsigned char> ?

--
Maxim Yegorushkin

No Microsoft product was used in any way to write or send this text.
If you use a Microsoft product to read it, you're doing so at your own risk
Posted via RSDN NNTP Server 2.0
Re[2]: Бесконечное чтение из потока, не определяется EOF
От: jek_  
Дата: 15.09.06 10:06
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Используешь std::ifstream или std::basic_ifstream<unsigned char> ?


std::ifstream
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.