5

ostream の istream がシーク可能かどうかを確認する方法はありますか?

無関係な理由でシークが失敗する可能性があるため、テストシークを実行してフェイルビットをチェックすることは正しくないと思われます。

それが違いを生む場合、LinuxとMacで動作するためにこれが必要です。

4

1 に答える 1

7

Iostreams はあまり役に立ちません。ストリーム オブジェクトは、 class から派生した buffer オブジェクトの単なるラッパーstd::streambufです。(「狭い」文字を想定しています。) 標準の派生バッファ クラスはstd::stringbuf、文字列std::filebuf用とファイル用です。ファイルのみに関心があると仮定するとstd::filebuf、C ライブラリ機能の単純なラッパーにすぎません。C ライブラリは、オブジェクトがシークをサポートしているかどうかを判断する方法を定義していませんFILE。シークを試みているだけでなく、C++ も同様です。

価値があるのは、のセマンティクスがseek少し異なることです。一部のプラットフォームでは、現在の位置までしかパイプを「シーク」できず、読み書きされた文字数を判断できません。最後を超えてシークすると、ファイルのサイズが変更されるか、次の書き込み操作でファイルのサイズが変更されるか、またはその中間の何かが発生する可能性があります。

errnoが設定されているかどうかを確認することもできますbadbit(または、私が好むように、フラグの代わりに例外を使用します)。

于 2012-02-26T07:01:26.350 に答える