ostream和ostringstream有什么区别?你何时会使用一个与另一个?
答案 0 :(得分:17)
简明扼要地说:ostringstream
提供streambuf
,ostream
要求用户提供一个。
要理解其含义,有必要了解一点
流是如何工作的(和其他一些海报不同,我不确定
在网上有一个很好的探索)。基本的抽象
ostream
的格式化文本输出。你给它一个int
或者一个
double
(或用户定义的类型 - 稍后更多),以及它
将其转换为char
类型的字符流。它能做什么
该流取决于附加到它的streambuf
;
这是策略模式的一个示例,其中streambuf
是一个
策略的抽象基类[1]。该标准提供了两个
streambuf
,filebuf
和stringbuf
的实现;在实践中,
在除了最简单的应用程序之外的所有应用程序中,您可能会有一些
你自己实现了。
输出时,您始终使用ostream
;这是班级
<<
运算符已定义。您正在将数据格式化为流
字符,你并不关心流最终的位置。
创建实例时:如果您创建ostream
,则必须提供
它自己streambuf
。更常见的是,你会创建一个
ofstream
或ostringstream
。这些都是“便利”类,
派生自ostream
,并为其提供streambuf
(filebuf
和stringbuf
,正好相反)。实际上,他们所做的所有都是
提供必要的streambuf
(它影响构造函数和
析构函数,而不是其他);在ofstream
的情况下,那里
也是一些额外的功能,转发到其他功能
filebuf
界面。
当你定义自己的时候,通常(但绝不是必需的)
streambuf
提供ostream
的便利重载(和{
istream
,如果相关的话),与ofstream
或
ostringstream
。
出于同样的原因,在创建实例时,通常使用其中一个
“方便”派生类,而不是直接使用ostream
并提供你自己的streambuf。
如果所有这些看起来很复杂:iostream类只使用
关于C ++的所有功能(虚拟功能,模板和
函数重载都起着重要的作用)。如果你只是
学习C ++,不要太担心它:只需使用ofstream
或
ostringstream
当你构造一个实例时,但是传递一下
对ostream
的引用。当你学习虚拟等技术时
函数,模板和运算符重载,返回到iostreams
了解他们在使代码更灵活方面所起的作用。
[1]由于各种原因,std::streambuf
实际上并不是抽象的。但
其中虚函数的实现是无用的;
提取总是返回EOF,插入总是失败。
答案 1 :(得分:10)
这是C ++流类的继承层次结构的很好的视图:)
该部分的This文章
3.1 ofstream and ostringstream
有你需要的东西。
实质上:ofstream
课程可以write data to files using stream operations
,而ostringstream
课程可以write to strings
。
答案 2 :(得分:5)
ostream
更通用(子类支持写入不同的地方),ostringstream
是写入string
答案 3 :(得分:4)
ostream
背后没有rdbuf
实现,而ostringstream
使用了stringbuf。试过文件?