什么是streambuf?我该如何使用它?

时间:2011-11-14 02:05:10

标签: c++ iostream

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

streambuf究竟是什么? 与streambufstringistream相比,何时使用vector? (我已经知道最后三个,但不知道streambuf如何与它们进行比较,如果它完全相同的话。)

2 个答案:

答案 0 :(得分:56)

streambuf的帮助下,我们可以在偶数更低级别中工作。它允许访问底层缓冲区。

以下是一些很好的示例:Copy, load, redirect and tee using C++ streambufs并参考比较,这可能会有所帮助,

enter image description here

详情请见IOstream Library

答案 1 :(得分:43)

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

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

理解差异的另一种方法是查看它们对区域设置对象的不同用法。 Streams使用与numpunctnum_get等格式有关的构面。您还可以预期,自定义时间或金钱数据类型的流operator<<operator>>的重载将使用时间和金钱格式方面。但是,流缓冲区使用codecvt facet,以便在它们的接口使用的单位和字节之间进行转换。因此,例如,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。通常只需使用一个带有适当方面的语言环境的宽流缓冲区,就可以达到同样的效果。