ostreamのistreamがシーク可能かどうかを確認する方法はありますか?C++ストリーム(iostream)がシーク可能かどうかをチェックする方法
テストシークを行うと思われ、failbitのチェックが正しくない 無関係の理由でシークが失敗する可能性があるためです。
LinuxとMacで動作するには、これが必要です。
ostreamのistreamがシーク可能かどうかを確認する方法はありますか?C++ストリーム(iostream)がシーク可能かどうかをチェックする方法
テストシークを行うと思われ、failbitのチェックが正しくない 無関係の理由でシークが失敗する可能性があるためです。
LinuxとMacで動作するには、これが必要です。
Iostreamsはあまり気にしません。ストリームオブジェクトは、クラスstd::streambuf
から派生したバッファオブジェクトのまわりのラッパーです。 (「狭い」文字と仮定します)標準の派生バッファクラスは、文字列の場合はstd::stringbuf
、ファイルの場合はstd::filebuf
です。あなただけがファイルに興味があるとすれば、std::filebuf
は、Cライブラリの機能を取り巻く単純なラッパーです。 Cライブラリは、FILE
オブジェクトがシークをサポートしているかどうかを判断する方法を定義していません。そうしないと、C++もそうしません。
seek
の意味は少し異なります。いくつかのプラットフォームでは、パイプを「シーク」できるだけでなく、現在の位置のみを使用して、いくつの文字が読み書きされたかを判断できます。最後を追うことでファイルのサイズを変更したり、次の書き込み操作でファイルのサイズを変更したりすることがあります。
badbit
が設定されている場合(または、好きなように、フラグの代わりに例外を使用する場合)、errno
をチェックしてみることもできます。
しかし、(あなたが言ったように)*無関係な*理由でシークが失敗した場合、それは理由が何であれ、ストリームがシーク可能でないことを意味します。 – Nawaz