С ++ файл плохой бит - PullRequest
       19

С ++ файл плохой бит

2 голосов
/ 30 марта 2010

когда я запускаю этот код, операция open, seekg и tellg завершилась успешно. но когда я читаю его, он терпит неудачу, бит eof, bad, fail равен 0 1 1.

Что может привести к повреждению файла? спасибо


int readriblock(int blockid, char* buffer)
{
   ifstream rifile("./ri/reverseindex.bin", ios::in|ios::binary);

   rifile.seekg(blockid * RI_BLOCK_SIZE, ios::beg);
   if(!rifile.good()){ cout<<"block not exsit"<<endl; return -1;}
   cout<<rifile.tellg()<<endl;

   rifile.read(buffer, RI_BLOCK_SIZE);

   **cout<<rifile.eof()<<rifile.bad()<<rifile.fail()<<endl;**

   if(!rifile.good()){ cout<<"error reading block "<<blockid<<endl; return -1;}

   rifile.close();
   return 0;
}

Ответы [ 2 ]

4 голосов
/ 30 марта 2010

Цитирование Руководства пользователя стандартной библиотеки Apache C ++ :

Флаг std :: ios_base :: badbit указывает на проблемы с базовым потоковым буфером. Эти проблемы могут быть:
  • Недостаток памяти. Нет памяти, доступной для создания буфера, или буфер имеет размер 0 по другим причинам (например, предоставленным извне потока), или поток не может выделить память для своих собственных внутренних данных, как с std :: ios_base :: iword () и std :: ios_base :: pword ().
  • Базовый буфер потока вызывает исключение. Потоковый буфер может потерять свою целостность, например, из-за нехватки памяти, сбоя преобразования кода или неисправимой ошибки чтения с внешнего устройства. Буфер потока может указывать на эту потерю целостности, выдавая исключение, которое перехватывается потоком и приводит к установке бадбита в состояние потока.

Это не говорит вам, в чем проблема, но может дать вам место для начала.

Имейте в виду, что бит EOF обычно не устанавливается до тех пор, пока не будет предпринята попытка чтения и произойдет сбой. (Другими словами, проверка rifile.good после вызова seekg может ничего не выполнить.)

Как предположил Андрей, проверка errno (или использование API для конкретной ОС) может помочь вам решить основную проблему. Этот ответ содержит пример кода для этого.

Примечание: поскольку rifile является локальным объектом, вам не нужно закрывать его после завершения. Понимание того, что важно для понимания RAII , ключевой техники в C ++.

2 голосов
/ 30 марта 2010

попробуй старое errno. Это должно показать реальную причину ошибки. к сожалению, в C ++ нет способа сделать это.

...