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