11

次よりも std::istream の長さを決定するためのより良い方法はありますか:

std::istream* pcStream = GetSomeStream();
pcStream->seekg(0, ios::end);
unsigned int uiLength = pcStream->tellg();

特に、ストリームが CD や DVD などの低速メディア上のファイルにある場合は、ストリームの最後までシークしてから元の位置に戻る必要があるのは、本当に無駄に思えます。

4

4 に答える 4

11

「最善の」方法は、長さを必要としないことです:)

  • すべてのストリームがシークできるわけではありません (たとえば、ネットワーク ソケット上の istream を想像してください)。
  • tellg() からの戻り値の型は、必ずしも数値である必要はありません (唯一の要件は、seekg() に戻して同じ位置に戻ることができることです)。
  • 数値であっても、必ずしもバイト数であるとは限りません。たとえば、「最後に」を意味する「魔法の」値である可能性があります。
  • fstream の場合、大文字と小文字の変換や改行の変換などの問題で問題が発生する可能性があります
于 2009-10-27T15:00:35.490 に答える
0

を呼び出しても長さを取得できないある種のストリームがありましたtellg()。の場合、tellg()返品する場合があり-1ます。

十分なサイズのバッファを準備することで、ストリームの長さを取得できます。stream::read関数を調べて、長さを取得する方法を見つけました。

const int DATA_SIZE = 1024 * 512;
char buf[DATA_SIZE];  // 1024 * 512 is enough!
std::istream& is = GetSomeStream();
int Len = is.rdbuf()->sgetn(buf, DATA_SIZE);

上記は、Lenの実際のデータ サイズですistream

于 2015-07-07T05:42:04.000 に答える
-2

istream::gcount() を使用してサイズを追跡することを検討しましたか?

于 2009-10-27T15:00:37.380 に答える