【问题标题】:How can I find out how many bytes are available from a std::istream?如何找出 std::istream 中有多少字节可用?
【发布时间】: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();优雅 并且相当快,虽然不是最快的)。

标签: c++ boost stl istream


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    我必须先找出有多少可用数据才能知道缓冲区有多大 - 不正确。见this answer of mine(第二部分)。

    【讨论】:

    • 这似乎不太正确...使用istream_iterator< char > 会跳过istream 上的空格,即使您将它与copy() 一起使用也是如此。因此,您最终得到的 vector< char> 缓冲区已删除所有空格!
    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2019-07-08
    相关资源
    最近更新 更多