Pregunta

cuando ejecuta este código, la operación de apertura y seekg y tellg todo el éxito. pero cuando lo leí, se produce un error, el EF, malo, fracasan bits son 0 1 1.

¿Qué puede causar un mal archivo? gracias


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;
}

¿Fue útil?

Solución

Citando la Guía del usuario Apache C ++ biblioteca estándar :

La bandera std :: :: ios_base badbit indica problemas con el búfer de la secuencia subyacente. Estos problemas pueden ser:
  • una falta de memoria. No hay memoria disponible para crear el búfer, o el tampón tiene tamaño 0 por otras razones (tales como ser proporcionada desde fuera de la corriente), o la corriente no puede asignar memoria para sus propios datos internos, como con std :: ios_base :: iword () y std :: :: ios_base pword ().
  • El búfer de la secuencia subyacente se produce una excepción. El búfer de la secuencia podría perder su integridad, como en la falta de memoria, o el fracaso de conversión de código, o un error de lectura irrecuperable desde el dispositivo externo. El búfer de la secuencia puede indicar esta pérdida de integridad por lanzar una excepción, que se captura por la corriente y los resultados en el establecimiento de la badbit en el estado de la corriente.

Eso no te dice cuál es el problema, pero podría darle un lugar para empezar.

Tenga en cuenta el poco EOF generalmente no se establece hasta que se intenta leer y falla. (En otras palabras, la comprobación rifile.good después de llamar seekg no puede lograr cualquier cosa.)

Como Andrey sugirió, comprobando errno (o el uso de una API del sistema operativo específico) podría dejar que te dan en el problema de fondo. Esta respuesta tiene código de ejemplo para hacer eso.

Nota al pie: Porque rifile es un objeto local, no es necesario para cerrarlo una vez que esté terminado. Entendiendo que es importante para entender RAII , una técnica clave en C ++.

Otros consejos

tratar de edad errno. Debe mostrar verdadera razón para el error. lamentablemente no hay forma de C ++ ish para hacerlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top