如何找出std :: istream中可用的字节数?

时间:2011-07-12 15:40:14

标签: 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() - pos;
    is.seekg( pos );
    return len;
}

同样地,因为std :: istream :: eof()不是一个非常有用的资金AFAICT,为了找出istream的get指针是否在流的末尾,我是这样做:

bool at_eof( std::istream &is )
{
    return available( is ) == 0;
}

我的问题:

有没有更好的方法从istream获取可用字节数?如果不是在标准库中,也许在boost中?

2 个答案:

答案 0 :(得分:4)

对于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, a_string)进行文本输入读取并在之后分析该字符串可能很有用。

答案 1 :(得分:3)

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

我必须首先了解有多少数据可用来知道缓冲区的大小 - 不是真的。见this answer of mine(第二部分)。