Цитирование Руководства пользователя стандартной библиотеки Apache C ++ :
Флаг std :: ios_base :: badbit указывает на проблемы с базовым потоковым буфером. Эти проблемы могут быть:
- Недостаток памяти. Нет памяти, доступной для создания буфера, или буфер имеет размер 0 по другим причинам (например, предоставленным извне потока), или поток не может выделить память для своих собственных внутренних данных, как с std :: ios_base :: iword () и std :: ios_base :: pword ().
- Базовый буфер потока вызывает исключение. Потоковый буфер может потерять свою целостность, например, из-за нехватки памяти, сбоя преобразования кода или неисправимой ошибки чтения с внешнего устройства. Буфер потока может указывать на эту потерю целостности, выдавая исключение, которое перехватывается потоком и приводит к установке бадбита в состояние потока.
Это не говорит вам, в чем проблема, но может дать вам место для начала.
Имейте в виду, что бит EOF обычно не устанавливается до тех пор, пока не будет предпринята попытка чтения и произойдет сбой. (Другими словами, проверка rifile.good
после вызова seekg
может ничего не выполнить.)
Как предположил Андрей, проверка errno
(или использование API для конкретной ОС) может помочь вам решить основную проблему. Этот ответ содержит пример кода для этого.
Примечание: поскольку rifile
является локальным объектом, вам не нужно закрывать его после завершения. Понимание того, что важно для понимания RAII , ключевой техники в C ++.