【问题标题】:std::basic_istream or std::basic_streambufstd::basic_istream 或 std::basic_streambuf
【发布时间】:2014-08-09 19:57:26
【问题描述】:

好吧,我现在很困惑;什么时候有人会在流上使用流缓冲区 - 或其他方式?

阅读cppreference 和一些与此相关的在线主题只会增加混乱。对我来说,std::basic_istream 似乎是缓冲区的“抽象”。这样就不必处理本地化等问题了。
但是在读取文件数据时仍然需要这样做——那么它实际上抽象出了什么?

另一方面,std::basic_streambuf 带来了什么?

然后是std::istream_iteratorstd::istreambuf_iterator。两者都从“流”中读取元素。这增加了更多的困惑:上面的迭代器有什么不同吗?

PS:在这里使用istream,但当然也可以是ostream 或其他任何东西。
PPS:我应该补充一点,在谷歌搜索 this stackoverflow question 等示例时添加了混淆

【问题讨论】:

  • 流缓冲区(如果流用于缓冲输入/输出)。换句话说,流对象使用缓冲区对象。您不应该直接使用缓冲区对象。
  • 您想要使用streambuf 的一种情况是在实现您自己的 iostream 派生类时。

标签: c++ stream


【解决方案1】:

std::basic_istream 定义用户界面:operator>>read 等。这就是你想要输入时所调用的。

std::basic_streambuf 定义了虚成员函数:underflowsync 等。这就是您在编写自己的输入类时所派生的。 boost.iostreams 让一切变得简单。

std::istream_iterator 调用 operator>>(因此它将输入解释为定义了 operator>> 的某种类型的对象序列,通过语言环境,跳过空格等)

std::istreambuf_iterator 直接访问一个streambuf(所以它只能读取字符,不涉及语言环境,空格不是特殊的)

【讨论】:

  • 嗯,这有点道理,但是如果读取通过 ios_mode::binary 打开的文件的特殊情况呢?另外我猜想在读取文件时获取 BOM 掩码,然后应该使用 buf-iterator?
  • @paul23 它有什么特别之处? BOM 与您的问题有什么关系? (在 C++11 中,这已经处理好了 by codecvt)。听起来您有一个更具体的问题。
  • 嗯,我的确切问题在stackoverflow.com/questions/4761529/… 那里找到。它使用streambuf迭代器,但为什么不以二进制模式打开文件,然后使用普通迭代器读取?
猜你喜欢
  • 2014-05-24
  • 2017-09-29
  • 2022-09-28
  • 2020-10-17
  • 2015-07-28
  • 2019-10-29
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
相关资源
最近更新 更多