ostream 和 ostringstream 有什么区别?您什么时候会使用其中一种?
4 回答
简而言之:ostringstream
提供一个streambuf
,ostream
要求用户提供一个。
要了解其中的含义,有必要了解一点流的工作原理,我不确定 Web 上是否对此有很好的解释。的基本抽象ostream
是格式化文本输出。你给它一个int
or a
double
(或一个用户定义的类型——稍后会详细介绍),它会将它转换成一个字符流,类型为char
。它对该流的作用取决于streambuf
附加到它的哪个;这是策略模式的一个示例,其中streambuf
是策略的抽象基类[1]。该标准提供了和的两种实现streambuf
;在实践中,除了最琐碎的应用程序之外,您可能会拥有一些您自己实现的应用程序。filebuf
stringbuf
输出时,您总是使用ostream
; 它
<<
是定义运算符的类。您正在将数据格式化为字符流,而您并不真正关心流的最终位置。
创建实例时:如果创建ostream
,则必须streambuf
自己提供。更多时候,您会创建一个
ofstream
或一个ostringstream
. 这些都是“便利”类,它们派生自ostream
,并streambuf
为它提供了一个(filebuf
并且stringbuf
,碰巧)。实际上,他们所做的只是提供必要的streambuf
东西(这会影响构造函数和析构函数,而不是太多);在 的情况下ofstream
,还有一些额外的功能转发到filebuf
界面中的附加功能。
streambuf
当您定义自己的以提供ostream
(和
istream
,如果相关)的便利重载时,通常(但绝不要求)
与ofstream
or
相同ostringstream
。
同理,在创建实例时,通常使用“方便”派生类之一,而不是ostream
直接使用并提供自己的 streambuf。
如果这一切看起来很复杂:iostream 类几乎使用了 C++ 的所有功能(虚拟函数、模板和函数重载都起着重要作用)。如果您只是在学习 C++,请不要太担心:只需在构造实例时使用ofstream
or
ostringstream
,但将引用传递给ostream
. 当您了解虚拟函数、模板和运算符重载等技术时,请返回 iostream 以了解它们在使代码更灵活方面所起的作用。
[1] 由于种种原因,std::streambuf
实际上并不抽象。但是其中的虚函数的实现是没有用的;提取总是返回 EOF,插入总是失败。
这是 C++ 流类的继承层次结构的好视图:)
该部分的这篇文章
3.1 ofstream and ostringstream
有你需要的东西。
本质上:ofstream
类使之成为可能,write data to files using stream operations
而ostringstream
类使之成为可能write to strings
。
ostream
更通用(子类支持写到不同的地方),ostringstream
是一个特定的写到一个string
ostream
它背后没有rdbuf
实现,而ostringstream
使用 stringbuf。尝试过文档?