什么是streambuf? 我如何使用它?
我想了解更多关于I / Ostream如何在C ++中工作,我真的很困惑什么时候使用。
什么是streambuf
?
什么时候使用streambuf
,与string
, istream
或vector
? (我已经知道最后三个了,但是不知道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使用与格式相关的方面,如numpunct
和num_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库