質問
私はこのコードの開seekgとtellg操作は全て成功。記事を読んで失敗した場合には、eof、悪いのビットは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;
}
解決
引用の ApacheのC++の標準ライブラリのユーザーガイド:
フラグstd::ios_base::badbitことを示し問題の基本となるストリームバッファです。これらの問題をできる:
- メモリ不足に悩まされています。ありませんメモリにバッファのバッファサイズが0のその他の事由などを提供している外部からのストリーム)は、ストリームのできないメモリを割り当てのための独自の内部データ、std::ios_base::iword()は、std::ios_base::pword().
- 基本となるストリームバッファの例外がスローされます。ストリームのバッファがって、その完全性、メモリ不足、またはコードの変換に失敗し、又は回復不能な読み取りエラーからの外部装置です。ストリームのバッファを切り換えて表示することができるこの損失は完全性により例外をスローするによってキャッチされていますのストリームの結果にbadbitのストリームの状態です。
ないようにするのは、そうです。
このEOFビットが一般的な設定で読み込みしようとしたと失敗します。(言い換えれば、チェック rifile.good
を呼び出した後 seekg
ない場合が達成のものです。)
としてAndreyとを確認し、 errno
(利用のOSの特定のAPI)もしており、元の問題です。 この答え は、コード例は、を行う。
注:ので rifile
地元のオブジェクトする必要がなくなり、より快適なる場合がありまだ終了しました。理解にとって重要な理解 Rau-α(, 主要技術のC++.
他のヒント
古いerrno
を試してみてください。これは、エラーの本当の理由を示さなければなりません。残念ながら、それを行うにはC ++っぽい方法があります。
所属していません StackOverflow