【发布时间】:2011-10-03 18:18:44
【问题描述】:
如果我想将read() std::istream 的内容放入缓冲区,我必须先找出有多少数据可用才能知道缓冲区有多大。为了从 istream 中获取可用字节数,我目前正在做这样的事情:
std::streamsize available( std::istream &is )
{
std::streampos pos = is.tellg();
is.seekg( 0, std::ios::end );
std::streamsize len = is.tellg() - pos;
is.seekg( pos );
return len;
}
同样,由于 std::istream::eof() 不是一个非常有用的基金 AFAICT,要找出 istream 的 get 指针是否位于流的末尾,我正在这样做:
bool at_eof( std::istream &is )
{
return available( is ) == 0;
}
我的问题:
有没有更好的方法从istream 获取可用字节数?如果不在标准库中,也许在 boost 中?
【问题讨论】:
-
我必须先找出有多少可用数据才能知道缓冲区有多大 - 不正确。见this answer of mine(第二部分)。
-
哇,有趣的答案。我认为这会奏效。谢谢!
-
@edam:为什么要提前知道buffer的大小,能不能读到你有buffer那么多?
-
@Als:我需要分配一个缓冲区,用来自
istream的数据填充它,然后将它传递给具有 C 风格 API 的库。所以,最终,我需要一个指向数据和数据长度的指针。 -
您可能想通过我的answer 查看上一个问题。最重要的是,虽然@Space_C0wb0y 的答案似乎应该是一个不错的答案,但通常有更好的替代方案——几乎不管你喜欢速度和优雅之间的权衡(特别是
sstream << stream.rdbuf();优雅 并且相当快,虽然不是最快的)。