2

このコードを実行すると、open、seekg、tellgの操作はすべて成功します。しかし、私がそれを読んだとき、それは失敗します、eof、bad、failビットは011です。

何がファイルを悪くする原因になりますか?ありがとう


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

4

2 に答える 2

4

Apache C ++標準ライブラリユーザーズガイドの引用:

フラグstd::ios_base :: badbitは、基になるストリームバッファに問題があることを示します。これらの問題は次のようになります。
  • メモリ不足。バッファを作成するために使用できるメモリがないか、他の理由(ストリームの外部から提供されるなど)でバッファのサイズが0であるか、std :: ios_base ::のように、ストリームが自身の内部データにメモリを割り当てることができません。 iword()およびstd :: ios_base :: pword()。
  • 基になるストリームバッファは例外をスローします。ストリームバッファは、メモリ不足、コード変換の失敗、または外部デバイスからの回復不能な読み取りエラーなど、整合性を失う可能性があります。ストリームバッファは、例外をスローすることでこの整合性の喪失を示すことができます。例外はストリームによってキャッチされ、結果としてストリームの状態に不良ビットが設定されます。

それはあなたに問題が何であるかを教えてくれませんが、それはあなたに始める場所を与えるかもしれません。

EOFビットは通常、読み取りが試行されて失敗するまで設定されないことに注意してください。rifile.good(つまり、呼び出し後にチェックしseekgても何も達成されない場合があります。)

Andreyが提案したように、チェックするerrno(またはOS固有のAPIを使用する)ことで、根本的な問題を突き止めることができるかもしれません。 この回答には、それを行うためのサンプルコードがあります。

補足:rifileはローカルオブジェクトであるため、終了したら閉じる必要はありません。これを理解することは、C++の重要な手法であるRAIIを理解するために重要です。

于 2010-03-30T18:04:54.777 に答える
3

古いものを試してくださいerrno。エラーの本当の理由を示す必要があります。残念ながら、それを行うためのC++風の方法はありません。

于 2010-03-30T17:51:12.273 に答える