Frage

, wenn ich diesen Code ausführen, der offene und seekg und tellg Betrieb all Erfolg. aber wenn ich es lesen, versagt es, die EOF, schlecht, Fail-Bit ist 0 1 1.

Was eine Datei schlecht verursachen kann? Dank


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

War es hilfreich?

Lösung

unter Angabe des Apache C ++ Standard Library Benutzerhandbuch :

Die Flagge std :: ios_base :: badbit gibt Probleme mit dem zugrunde liegenden Strompuffer. Diese Probleme könnten sein:
  • Mangel Speicher. Es gibt keinen Speicher zur Verfügung, den Puffer zu schaffen, oder der Puffer Größe 0 aus anderen Gründen (wie von außerhalb des Stroms vorgesehen ist), oder der Stream keinen Speicher zuordnen für seine eigenen internen Daten, wie mit std :: ios_base :: iword () und std :: ios_base :: pword ().
  • Der zugrunde liegende Strompuffer löst eine Ausnahme. Der Strompuffer könnte seine Integrität verlieren, wie in Speicherknappheit oder Codeumwandlungsfehler oder einen nicht behebbarer Lesefehler von dem externen Gerät. Der Strompuffer kann dieser Verlust der Integrität zeigen, durch das Auslösen einer Ausnahme, die durch den Strom und die Ergebnisse bei der Einstellung der badbit in dem Stream des Staates gefangen wird.

Das macht man nicht sagen, was das Problem ist, aber es könnte Sie einen Platz geben zu beginnen.

im Auge behalten wird der EOF-Bit im Allgemeinen nicht gesetzt, bis ein Lese versucht wird, und schlägt fehl. (Mit anderen Worten, die Überprüfung rifile.good nach seekg Aufruf kann nicht alles erreichen.)

Als Andrey vorgeschlagen, errno Überprüfung (oder mit einer OS-spezifischen API) können Sie auf dem zugrunde liegende Problem bekommen lassen. Diese Antwort Beispielcode hat, dass zu tun.

Side Hinweis: Da rifile ein lokales Objekt ist, brauchen Sie nicht, es zu schließen, sobald Sie fertig sind. dass zu verstehen, ist wichtig für das Verständnis RAII , eine Schlüsseltechnik in C ++.

Andere Tipps

versuchen alte errno. Es sollte für Fehler wahren Grund zeigen. leider gibt es keine C ++ ish Art und Weise, es zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top