【问题标题】:What exactly is streambuf? How do I use it?究竟什么是streambuf?我该如何使用它?
【发布时间】:2011-12-28 07:52:47
【问题描述】:

我正在尝试更多地了解 I/O 流如何在 C++ 中工作,但我真的很困惑何时使用什么。

streambuf 到底是什么?
stringistreamvector 相比,我何时使用streambuf? (我已经知道最后三个,但不知道 streambuf 与它们相比如何,如果有的话。)

【问题讨论】:

  • 这是一个糟糕的流缓冲区抽象。
  • @Pubby:呃,什么是“流缓冲区”?它与流或缓冲区有什么不同?
  • @moshbear:抱歉,我不知道那是什么意思。
  • @Mehrdad Stroustrup 的 C++ 编程语言:特别版
  • 如果这能让你感觉好一些,我已经使用 C++ 15 年了,但仍然没有得到 C++ 库的 IO 部分。没有一个项目让我有机会使用它。

标签: c++ iostream


【解决方案1】:

streambuf 的帮助下,我们可以在一个更更低的层次工作。它允许访问底层缓冲区。

这里有一些很好的例子:Copy, load, redirect and tee using C++ streambufs 和参考比较,这可能会有所帮助,

更多详情请参见:IOstream Library

【讨论】:

  • 我到处搜索可以解释 streambuf 和这篇文章的东西。感谢您帮我找到它!
  • 示例总是最好的。谢谢
【解决方案2】:

流缓冲区表示输入或输出设备,并为该设备的未格式化 I/O 提供低级接口。另一方面,流通过基本的未格式化 I/O 函数,尤其是格式化 I/O 函数(即 operator<<operator>> 重载),在缓冲区周围提供更高级别的包装器。流对象还可以管理流缓冲区的生命周期。

例如,文件流有一个内部文件流缓冲区。流管理缓冲区的生命周期,而缓冲区为文件提供了实际的读写能力。流的格式化操作符最终会访问流缓冲区的未格式化 I/O 函数,因此您只需使用流的 I/O 函数,而无需直接接触缓冲区的 I/O 函数。

另一种理解差异的方法是查看它们对语言环境对象的不同用途。流使用与格式有关的方面,例如numpunctnum_get。您还可以预期,自定义时间或金钱数据类型的流operator<<operator>> 的重载将使用时间和金钱格式方面。然而,流缓冲区使用 codecvt 方面来在其接口使用的单位和字节之间进行转换。因此,例如,basic_streambuf<char16_t> 的接口使用char16_t,因此basic_streambuf<char16_t> 在内部默认使用codecvt<char16_t, char, mbstate_t> 将写入缓冲区的格式化char16_t 单位转换为写入底层设备的char 单位。因此,您可以看到流主要用于格式化,流缓冲区为未格式化的输入或输出提供低级接口,这些设备可能使用不同的外部编码。

当您只想对 I/O 设备进行无格式访问时,可以使用流缓冲区。如果要设置共享流缓冲区的多个流,也可以使用流缓冲区(尽管您必须仔细管理缓冲区的生命周期)。您可能还想使用一些特殊用途的流缓冲区,例如 C++11 中的 wbuffer_convert,它充当 basic_streambuf<char> 的外观,使其看起来像一个宽字符流缓冲区。它使用构造它的 codecvt facet,而不是使用附加到任何语言环境的 codecvt facet。您通常可以通过简单地使用具有适当方面的语言环境的宽流缓冲区来实现相同的效果。

【讨论】:

  • 这已经晚了 5 年,所以我不会把它作为答案发布并且不接受这个,但是对于即使在阅读了这篇文章后仍然对术语感到困惑的任何人:streambuf用于原始 数据(例如原始字节、原始整数等),而stream 用于 数据(文本、格式化为文本的整数等)。换句话说,stream 代表 解析(或序列化)层。在处理纯字符串时,从技术上讲,您可以使用其中任何一种,但含义不同:streambuf 表示您希望原始数据成为字符串本身,而stream 抽象出编码。
  • @Mehrdad 请问stream抽象编码是什么意思? :D 你能多解释一下或提供一些进一步的材料吗?
  • @Rick:当然。 stream 负责读取和写入对象streambufstreambuf 负责从字节存储位置保存和恢复字节(或字符/单词/您喜欢的任何名称)。对象和字节之间的映射就是我所说的“编码”。这方面的一个例子是stream 将接受int,然后决定如何将其转换为chars,反之亦然——它可以使用大端格式,小端格式,有点-reversed 格式、仅 7 位格式或其他任何格式。即它抽象出存储格式。
猜你喜欢
  • 2011-05-03
  • 2019-01-22
  • 2019-08-21
  • 2020-08-27
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多