我试图学习更多有关I / O流在C ++中的工作方式的信息,我对何时使用什么感到困惑。
到底是什么streambuf
?与a ,an或a相比,
我什么时候使用a ?(我已经知道最后三个了,但如果能做到的话,还不知道如何与之比较。)streambuf
string
istream
vector
streambuf
我试图学习更多有关I / O流在C ++中的工作方式的信息,我对何时使用什么感到困惑。
到底是什么streambuf
?与a ,an或a相比,
我什么时候使用a ?(我已经知道最后三个了,但如果能做到的话,还不知道如何与之比较。)streambuf
string
istream
vector
streambuf
Answers:
流缓冲区代表输入或输出设备,并为该设备的未格式化I / O提供低级接口。流,另一方面,由基本未格式化的I / O功能和方式尤其是通过格式化的I / O功能(即提供围绕缓冲器更高的水平包装operator<<
和operator>>
过载)。流对象还可以管理流缓冲区的生存期。
例如,文件流具有内部文件流缓冲区。流管理缓冲区的生存期,而缓冲区则为文件提供实际的读取和写入功能。流的格式化运算符最终会访问流缓冲区的未格式化I / O函数,因此您只需要使用流的I / O函数,而无需直接触摸缓冲区的I / O函数。
了解差异的另一种方法是查看它们对语言环境对象的不同使用。流使用与诸如numpunct
和格式有关的方面num_get
。您还可以期望流的重载operator<<
以及operator>>
自定义时间或金钱数据类型的重载将使用时间和金钱格式方面。但是,流缓冲区使用编解码器构面,以便在其接口使用的单位和字节之间进行转换。因此,例如,默认情况下,供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中,它充当a的外观,basic_streambuf<char>
使其看起来像宽字符流缓冲区。它使用构造时使用的编解码器构面,而不是使用附加到任何语言环境的编解码器构面。通常,您可以简单地使用带有适当构面的区域设置的宽流缓冲区来达到相同的效果。
streambuf
也适用于原始数据(例如原始字节,原始整数)等),而stream
用于煮熟的数据(文本,格式化为文本的整数等)。换句话说,stream
表示解析(或序列化)层。在处理纯字符串时,从技术上讲,您可以使用其中任何一种,但是含义有所不同:streambuf
意味着您希望原始数据本身就是字符串,而stream
抽象化了编码。
stream
抽象编码是什么意思吗?:D您能再解释一下还是提供更多资料?
stream
负责读取和写入对象的streambuf
。streambuf
负责从字节存储位置保存和恢复字节(或char / words /任何您喜欢调用的字节)。对象和字节之间的映射就是我所说的“编码”。例如,astream
会接受anint
然后决定如何将其转换为char
s,反之亦然-它可以使用big-endian格式,little-endian格式,位反转格式,7位-仅格式,或其他任何格式。即它抽象出了存储格式。
在的帮助下streambuf
,我们可以在更低的水平上工作。它允许访问基础缓冲区。
这里有一些很好的例子:使用C ++ streambufs复制,加载,重定向和tee并参考比较,这可能会有所帮助,
有关更多详细信息,请参见:IOstream库