2016-07-20 13 views
1

私はfstreamポインタfileP_を持っています。だからここに私は、ファイルのオフセット@offsetから始まる@buffer@sizeを読む
int Read(size_t offset, char *buffer, size_t *size)
:私はそれとしての定義とRead()機能を持っている
fileP_.open(filePath_.c_str(), std::ios::in|std::ios::binary);

は、私が使用してファイルを開きます。 Read()
私のコードは、多少、このようなものです:オフセットがファイルサイズを超えていても、eofビットが設定されない

int rc = 0 
fileP_.seekg(offset); 
fileP_.read(buffer, *size); 
if (!fileP_.gcount()) { 
    if (fileP_.eof()) 
    *size = rc; 
    else if (fileP_.fail()) 
    rc = -EIO; 
.... 

コードがoffset < filesizeまで正常に動作しますが、私はoffset > filesizeを与える場合gcount()が(予想される)0を与えますが、私は-EIOを取得し、私は、もしoffset > filesizesize = rc = 0を期待します。
上記のコードで何か不足していますか?
ありがとうございます!

+0

フェイルビットが設定されていても、操作が失敗すると、フェイルビットが設定され、読み込みに失敗します。(eofは設定されていません) – EFenix

+0

私はC++を初めて使用しています。ビットはあります。 seekg()の後にfailbitが設定されているかどうかをチェックするコードを変更しました。どうもありがとう! –

+0

@AntonioGarrido上記のコードにチェックが必要な場合は、私が手引きをしてもらえますか? –

答えて

0

あなたはseekg>操作が失敗し、failbitが設定され、読み込まれ動作しないファイルサイズなら...(EOF設定されていない)

一つの操作が失敗した場合は、failbitが活性化し、以下のすべての操作が意志されます状態ビットがクリアされるまでは何もしないでください。この場合、seekgが失敗すると、istream :: readは何も読み取らず、特にeofbitを設定しません。

一方、ファイル内の位置が「終わり」である場合、eofbitはアクティブ化されません。実際には、ストリームがファイルの終わりを検出したとき、つまり次のcharを取得しようとしたときにEOFが返されたときに起動されます。

一般に、C++では、eofbitを使用して入力の終了を制御することはお勧めできません。操作が成功したかどうかをテストする方が良いです。操作が失敗した場合は、eofbitを使用して問題がファイルの終わりかどうかをテストします。

+0

さようなら!どうもありがとう! :-) –

関連する問題