2011-11-14 68 views
55

我想了解更多关于I/O流如何在C++中工作,并且我很困惑什么时候使用它。streambuf究竟是什么?我如何使用它?

究竟是什么streambuf
何时使用streambuf,与stringistreamvector相比? (我已经知道过去三年,但不知道如何streambuf比较他们,如果它在所有。)

+0

这是流缓冲区的一个糟糕的抽象。 – Pubby

+1

@Pubby:呃,什么是“流缓冲区”?它与流或缓冲区有什么不同? – Mehrdad

+0

据我所知,一个流格式化输入/输出并将其存储在缓冲区中。 – Pubby

回答

38

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

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

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

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

+3

这是5年太晚了,所以我不会将它作为答案发布,并且不接受这个答案,但对于仍然被这个术语混淆的人来说,即使在阅读完这些后:'streambuf'用于** raw **数据(例如原始字节,原始数据等),而'stream'用于**熟**数据(文本,整数格式化为文本等)。换句话说,'stream'表示**解析**(或序列化)层。在处理纯字符串时,您可以在技术上使用,但其含义不同:'streambuf'表示您希望原始数据本身是字符串,而'stream'则将编码抽象出来。 – Mehrdad

46

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

这里有一些很好的例子:Copy, load, redirect and tee using C++ streambufs和参考比较,这可能是有帮助的,

enter image description here

有关详细信息,请参阅本:IOstream Library

+3

+1指向一篇优秀的文章。 – jweyrich

+1

我全面搜索了一些可以解释streambuf以及本文的东西。感谢您帮助我找到它! – wvdschel