次よりも std::istream の長さを決定するためのより良い方法はありますか:
std::istream* pcStream = GetSomeStream();
pcStream->seekg(0, ios::end);
unsigned int uiLength = pcStream->tellg();
特に、ストリームが CD や DVD などの低速メディア上のファイルにある場合は、ストリームの最後までシークしてから元の位置に戻る必要があるのは、本当に無駄に思えます。
「最善の」方法は、長さを必要としないことです:)
を呼び出しても長さを取得できないある種のストリームがありました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
。
istream::gcount() を使用してサイズを追跡することを検討しましたか?