ostream和ostringstream有什么区别?您何时会使用一个与另一个?
最佳答案
简而言之:ostringstream
提供了streambuf
,ostream
要求用户提供一个。
要了解其含义,有必要一点点了解
流是如何工作的,我不确定网络上对此是否有很好的解释。基本的抽象ostream
正在格式化文本输出。您给它一个int
或double
(或用户定义的类型,稍后会介绍),
将其转换为char
类型的字符流。它能做什么
该流取决于附加到它的streambuf
;
这是策略模式的一个示例,其中streambuf
是
策略的抽象基类[1]。该标准提供了两个streambuf
,filebuf
和stringbuf
的实现;在实践中,
在除最琐碎的应用程序之外的所有应用程序中,您可能都会
你实现自己。
输出时,始终使用ostream
;这是上课的
定义了<<
运算符。您正在将数据格式化为流
字符,而您实际上并不关心流在哪里结束。
创建实例时:如果创建ostream
,则必须提供
自己加上streambuf
。通常,您将创建一个ofstream
或ostringstream
。这些都是“便利”类(class),
衍生自ostream
,并为其提供streambuf
(filebuf
和stringbuf
)。实际上,他们所做的就是
提供必要的streambuf
(这会影响构造函数和
析构函数,其他没有太多);在ofstream
的情况下,
还有一些额外的功能,可以转发到filebuf
接口(interface)。
定义自己的方法时很常见(但不需要)streambuf
提供ostream
的便利重载(和istream
(如果相关),与ofstream
相同,或ostringstream
。
同样,创建实例时,通常使用以下方法之一
“便捷”派生类,而不是直接使用ostream
并提供您自己的streambuf。
如果这一切看起来都很复杂:iostream类仅使用
关于C++的所有功能(虚拟函数,模板和
函数重载都起着重要作用)。如果你只是
在学习C++时,不必太担心:只需使用ofstream
或
构造实例但传递时的ostringstream
对ostream
的引用。当您了解虚拟技术时
函数,模板和运算符重载,返回到iostream
了解它们在使代码更灵活方面所扮演的角色。
[1]由于各种原因,std::streambuf
实际上不是抽象的。但
虚拟功能的实现是无用的;
提取总是返回EOF,插入总是失败。