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() 以返回相同的位置)
  • 即使是数字,也不一定是字节数。例如,它可能是一个“魔术”值,意思是“最后”
  • 对于 fstreams,大小写和换行转换等问题可能会搞砸
于 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 回答
-2

为了获得蒸汽的当前长度/大小,我这样做:

auto size = strlen(currentStream.str().c_str());

这需要在将其大小设置为0诸如move(currentStream).

于 2019-01-04T22:55:57.793 回答