更好的方法来确定std :: istream的长度?

时间:2009-10-27 14:42:57

标签: c++ stream std

是否有更好的方法来确定std :: istream的长度,而不是以下内容:

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

看起来真的很浪费,必须寻找到流的末尾,然后寻找原来的位置,特别是如果流可能是某些慢速媒体上的文件,如CD或DVD。

4 个答案:

答案 0 :(得分:7)

“最好”的方法是避免需要长度:)

  • 并非所有流都是可搜索的(例如,想象网络套接字上的istream)
  • tellg()的返回类型不一定是数字(唯一的要求是它可以传递回seekg()以返回到相同的位置)
  • 即使是数字,也不一定是字节数。例如,它可能是一个“魔术”值,意思是“最后”
  • 对于fstream,像case和linefeed转换这样的问题可能会搞砸了

答案 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);

以上,Lenistream中的实际数据大小。