我正在尝试更多地了解I/O流如何在C++中工作,我真的很困惑何时使用什么.
究竟是什么streambuf
?
我何时使用a streambuf
,a string
,a istream
或a vector
?(我已经知道了最后三个,但不知道如何streambuf
与它们进行比较,如果有的话.)
COD*_*BOY 60
在streambuf
我们的帮助下,我们可以在更低的水平上工作.它允许访问底层缓冲区.
以下是一些很好的示例:使用C++ streambufs复制,加载,重定向和发球,并参考比较,这可能会有所帮助,
有关更多详细信息,请参阅此处:IOstream Library
bam*_*s53 46
流缓冲区代表输入或输出设备,并为该设备的未格式化I/O提供低级接口.流,另一方面,由基本未格式化的I/O功能和方式尤其是通过格式化的I/O功能(即提供围绕缓冲器更高的水平包装operator<<
和operator>>
过载).流对象还可以管理流缓冲区的生命周期.
例如,文件流具有内部文件流缓冲区.流管理缓冲区的生命周期,缓冲区为文件提供实际的读写功能.流的格式化操作符最终访问流缓冲区的未格式化I/O函数,因此您只需使用流的I/O函数,而无需直接触摸缓冲区的I/O函数.
理解差异的另一种方法是查看它们对区域设置对象的不同用法.Streams使用与格式有关的方面,例如numpunct
和num_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设备进行无格式访问,则可以使用流缓冲区.如果要设置共享流缓冲区的多个流,也可以使用流缓冲区(尽管您必须仔细管理缓冲区的生命周期).还有一些您可能想要使用的特殊用途流缓冲区,例如wbuffer_convert
在C++ 11中,它充当了basic_streambuf<char>
使其看起来像宽字符流缓冲区的外观.它使用它构造的codecvt facet,而不是使用附加到任何语言环境的codecvt facet.您通常可以通过简单地使用具有适当方面的区域设置的宽流缓冲区来实现相同的效果.