streambuf到底是什么?如何使用?


78

我试图学习更多有关I / O流在C ++中的工作方式的信息,我对何时使用什么感到困惑。

到底是什么streambuf?与a ,an或a相比,
我什么时候使用a ?(我已经知道最后三个了,但如果能做到的话,还不知道如何与之比较。)streambufstringistreamvectorstreambuf


这是流缓冲区的糟糕抽象。
2011年

1
@Pubby:嗯,什么是“流缓冲区”?它与流或缓冲区有何不同?
2011年

3
@moshbear:对不起,我不知道这是什么意思。
2011年

1
@Mehrdad Stroustrup的C ++编程语言:特别版
moshbear 2011年

4
如果这会让您感觉更好,我已经使用C ++已有15年了,但仍然没有获得C ++库的IO部分。我没有一个项目可以使用它。
Nemanja Trifunovic

Answers:


49

流缓冲区代表输入或输出设备,并为该设备的未格式化I / O提供低级接口。流,另一方面,由基本未格式化的I / O功能和方式尤其是通过格式化的I / O功能(即提供围绕缓冲器更高的水平包装operator<<operator>>过载)。流对象还可以管理流缓冲区的生存期。

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

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

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


13
这已经晚了5年,所以我不打算将其发布为答案并且不接受此答案,但是对于仍然对术语感到困惑的任何人,即使在阅读以下内容之后:streambuf也适用于原始数据(例如原始字节,原始整数)等),而stream用于煮熟的数据(文本,格式化为文本的整数等)。换句话说,stream表示解析(或序列化)层。在处理纯字符串时,从技术上讲,您可以使用其中任何一种,但是含义有所不同:streambuf意味着您希望原始数据本身就是字符串,而stream抽象化了编码。
user541686 '16

@Mehrdad我想问一说stream抽象编码是什么意思吗?:D您能再解释一下还是提供更多资料?
瑞克(Rick)

3
@Rick:好的。stream负责读取和写入对象streambufstreambuf负责从字节存储位置保存和恢复字节(或char / words /任何您喜欢调用的字节)。对象和字节之间的映射就是我所说的“编码”。例如,astream会接受anint然后决定如何将其转换为chars,反之亦然-它可以使用big-endian格式,little-endian格式,位反转格式,7位-仅格式,或其他任何格式。即它抽象出了存储格式。
user541686 '18

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.