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

我想了解更多关于I / Ostream如何在C ++中工作,我真的很困惑什么时候使用。

什么是streambuf
什么时候使用streambuf ,与stringistreamvector ? (我已经知道最后三个了,但是不知道streambuf与他们的比较,如果是的话)。

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

例如,文件stream具有内部文件stream缓冲区。 streampipe理缓冲区的生命周期,缓冲区是为文件提供实际的读写能力。 stream的格式化操作符最终访问stream缓冲区的未格式化的I / O函数,所以您只需要使用stream的I / O函数,而不需要直接触摸缓冲区的I / O函数。

了解差异的另一种方法是查看它们对区域设置对象的不同用途。 stream使用与格式相关的方面,如numpunctnum_get 。 您也可以期望streamoperator<<operator>>的自定义时间或货币数据types的重载将使用时间和货币格式化构面。 然而,stream缓冲区使用codecvt构面来在它们的接口使用的单元和字节之间进行转换。 因此,例如, basic_streambuf<char16_t>的接口使用char16_t ,因此basic_streambuf<char16_t>内部默认使用codecvt<char16_t, char, mbstate_t>将写入缓冲区的格式化的char16_t单元转换为写入底层设备的char单元。 所以您可以看到,stream主要用于格式化,而stream缓冲区为未格式化的input或输出到可能使用不同的外部编码的设备提供低级别接口。

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

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

下面是一些很好的例子: 复制,加载,redirect和使用C ++ streambufs和引用比较,这可能会有所帮助,

在这里输入图像说明

看到这个更多的细节: IOstream库