什么是streambuf?我该如何使用它?

Meh*_*dad 74 c++ iostream

我正在尝试更多地了解I/O流如何在C++中工作,我真的很困惑何时使用什么.

究竟是什么streambuf
我何时使用a streambuf,a string,a istream或a vector?(我已经知道了最后三个,但不知道如何streambuf与它们进行比较,如果有的话.)

COD*_*BOY 60

streambuf我们的帮助下,我们可以在更低的水平上工作.它允许访问底层缓冲区.

以下是一些很好的示例:使用C++ streambufs复制,加载,重定向和发球,并参考比较,这可能会有所帮助,

在此输入图像描述

有关更多详细信息,请参阅此处:IOstream Library

  • 我到处搜索可以解释 streambuf 和这篇文章的东西。谢谢你帮我找到它! (2认同)

bam*_*s53 46

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

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

理解差异的另一种方法是查看它们对区域设置对象的不同用法.Streams使用与格式有关的方面,例如numpunctnum_get.您还可以预期流的重载operator<<以及operator>>自定义时间或货币数据类型将使用时间和金钱格式方面.但是,流缓冲区使用codecvt facet,以便在它们的接口使用的单位和字节之间进行转换.因此,例如,对于接口basic_streambuf<char16_t>的用途char16_tbasic_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.您通常可以通过简单地使用具有适当方面的区域设置的宽流缓冲区来实现相同的效果.

  • 这已经太晚了5年,所以我不打算将它作为答案发布并且不接受这个,但是对于那些仍然对术语感到困惑的人,即使在读完之后:`streambuf`是**原始**数据(例如原始字节,原始int等),而`stream`用于**cooked**数据(文本,格式化为文本的整数等).换句话说,`stream`表示**解析**(或序列化)层.处理普通字符串时,你可以在技术上使用它们,但意思不同:`streambuf`表示你希望原始数据是字符串本身,而`stream`表示抽象编码. (11认同)
  • @Rick:好的。“ stream”负责“读写对象”到“ streambuf”。`streambuf`负责*从字节存储位置保存和恢复字节*(或char / words /无论您喜欢称呼什么)。对象和字节之间的映射就是我所说的“编码”。这样的一个例子是,“流”将接受“ int”,然后决定如何将其转换为“ char”,反之亦然-它可以使用大端格式,小端格式,反转格式,仅7位格式或其他任何格式。即它抽象出了存储格式。 (2认同)