是否有更好的方法来确定std :: istream的长度,而不是以下内容:
std::istream* pcStream = GetSomeStream();
pcStream->seekg(0, ios::end);
unsigned int uiLength = pcStream->tellg();
看起来真的很浪费,必须寻找到流的末尾,然后寻找原来的位置,特别是如果流可能是某些慢速媒体上的文件,如CD或DVD。
答案 0 :(得分:7)
“最好”的方法是避免需要长度:)
答案 1 :(得分:1)
为了获得当前蒸汽的长度/大小,我这样做:
auto size = strlen(currentStream.str().c_str());
这需要在将其大小设置为0
的函数(例如move(currentStream)
)之前发生。
答案 2 :(得分:-1)
您是否考虑过使用istream :: gcount()?
来跟踪大小答案 3 :(得分:-1)
通过调用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
中的实际数据大小。