9

如果我想将read()a 的内容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 中?

4

2 回答 2

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),之后通过读取和分析该字符串可能很有用。

于 2011-07-12T15:53:24.810 回答
3

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

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

于 2011-07-12T16:22:06.050 回答