C++ 如何确定std::istream中有多少字节可用?

C++ 如何确定std::istream中有多少字节可用?,c++,boost,stl,istream,C++,Boost,Stl,Istream,如果我想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()

如果我想
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中?

对于
std::cin
,您不需要担心缓冲,因为它已经被缓冲了,而且您无法预测用户笔划了多少个键

对于打开的二进制文件
std::ifstream
,也会被缓冲,您可以调用
seekg(0,std::ios:end)
tellg()
方法来确定有多少字节

阅读以下内容后,还可以调用
gcount()
方法:

char buffer[SIZE];

while (in.read(buffer,SIZE))
{
  std::streamsize num = in.gcount();
  // call your API with num bytes in buffer 
}

对于通过
std::getline(inputstream,一个字符串)读取文本输入,然后分析该字符串可能会很有用。

将此作为答案发布,因为这似乎是OP想要的


我必须先找出有多少数据可用,才能知道缓冲区有多大——这不是真的。请参阅(第二部分)。

我必须先找出有多少数据可用,才能知道缓冲区有多大—这不是真的。看(第二部分)。哇,有趣的答案。我想这会管用的。谢谢@edam:为什么你需要提前知道缓冲区的大小,你能不能读到你拥有的缓冲区那么多?@Als:我需要分配一个缓冲区,用
istream
中的数据填充它,然后用C风格的API将它传递到库中。因此,最终,我需要一个指向数据和数据长度的指针。您可能希望通过我的链接查看前面的问题。归根结底,@Space_c0w0y的答案似乎应该是一个不错的答案,但总的来说还是有更好的选择——几乎不管你喜欢在速度和优雅之间做什么权衡(特别是,
sstream这似乎不太正确……使用
istream\u迭代器
跳过
istream
上的空格,即使您将其与
copy()
一起使用。因此,最终使用的
向量
缓冲区已删除所有空格!