有没有比以下更好的方法来确定 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() 来跟踪大小?
为了获得蒸汽的当前长度/大小,我这样做:
auto size = strlen(currentStream.str().c_str());
这需要在将其大小设置为0
诸如move(currentStream)
.