2012-02-26 11 views
3

ostreamのistreamがシーク可能かどうかを確認する方法はありますか?C++ストリーム(iostream)がシーク可能かどうかをチェックする方法

テストシークを行うと思われ、failbitのチェックが正しくない 無関係の理由でシークが失敗する可能性があるためです。

LinuxとMacで動作するには、これが必要です。

+2

しかし、(あなたが言ったように)*無関係な*理由でシークが失敗した場合、それは理由が何であれ、ストリームがシーク可能でないことを意味します。 – Nawaz

答えて

5

Iostreamsはあまり気にしません。ストリームオブジェクトは、クラスstd::streambufから派生したバッファオブジェクトのまわりのラッパーです。 (「狭い」文字と仮定します)標準の派生バッファクラスは、文字列の場合はstd::stringbuf、ファイルの場合はstd::filebufです。あなただけがファイルに興味があるとすれば、std::filebufは、Cライブラリの機能を取り巻く単純なラッパーです。 Cライブラリは、FILEオブジェクトがシークをサポートしているかどうかを判断する方法を定義していません。そうしないと、C++もそうしません。

seekの意味は少し異なります。いくつかのプラットフォームでは、パイプを「シーク」できるだけでなく、現在の位置のみを使用して、いくつの文字が読み書きされたかを判断できます。最後を追うことでファイルのサイズを変更したり、次の書き込み操作でファイルのサイズを変更したりすることがあります。

badbitが設定されている場合(または、好きなように、フラグの代わりに例外を使用する場合)、errnoをチェックしてみることもできます。

関連する問題