Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 确定std::istream长度的更好方法?_C++_Stream_Std - Fatal编程技术网

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

C++ 确定std::istream长度的更好方法?,c++,stream,std,C++,Stream,Std,是否有比以下方法更好的方法来确定std::istream的长度: std::istream* pcStream = GetSomeStream(); pcStream->seekg(0, ios::end); unsigned int uiLength = pcStream->tellg(); 必须先搜索到流的末尾,然后再搜索回原始位置,这似乎真的很浪费,尤其是当流可能是在CD或DVD等慢速介质上的文件时。最好的方法是避免需要长度:) 并非所有流都是可查找的(例如,假设网络套接字

是否有比以下方法更好的方法来确定std::istream的长度:

std::istream* pcStream = GetSomeStream();
pcStream->seekg(0, ios::end);
unsigned int uiLength = pcStream->tellg();
必须先搜索到流的末尾,然后再搜索回原始位置,这似乎真的很浪费,尤其是当流可能是在CD或DVD等慢速介质上的文件时。

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

  • 并非所有流都是可查找的(例如,假设网络套接字上有一个istream)
  • tellg()的返回类型不一定是数字类型(唯一的要求是可以将其传递回seekg()以返回到相同的位置)
  • 即使是数字,也不一定是字节数。例如,它可能是一个“神奇”的值,意思是“在最后”
  • 对于fstream,case和linefeed转换之类的问题可能会把事情搞砸

您是否考虑过使用istream::gcount()跟踪大小?

有一种流无法通过调用
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

中的实际数据大小,为了获得蒸汽的当前长度/大小,我执行以下操作:

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

这需要在将其大小设置为
0
的函数之前发生,例如
move(currentStream)

我正在使用的API需要传递的数据的大小。它使用一个原始字符缓冲区,并一直对其进行处理,直到到达缓冲区的末尾。然而,它并不比在阅读内容之前在结尾寻找和在开头寻找快。。。这就是文件描述符的实现方式。当然,<代码> Stand()>代码>不是C++,它需要一个文件名…我确实意识到一个长度总是可用的,这对使用的流类型有点限制,谢天谢地,我不太可能使用任何其他的流和我自己的MeMeSt流和ZIPFROW实现。始终是数字,基于a。我需要分配数据将被复制到的缓冲区的大小-我想我可以分配一个初始量,然后再分配realloc,但我有点担心碎片(在有限的mem环境中工作)。我要补充一点,如果您正在调试,这很有用。这对于生产代码等来说并不理想,但如果你有一个不符合逻辑的流,你可以用它窥视它的内容,并确定你做错了什么。。。