Использую тривиальную связку 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 ничего не дали, там сильно вложенный и сложный код.
Помогите, кто с таким сталкивался.
Заранее спасибо.
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