ostream和ostringstream有什么区别?您何时会使用一个与另一个?

最佳答案

简而言之:ostringstream提供了streambufostream要求用户提供一个。

要了解其含义,有必要一点点了解
流是如何工作的,我不确定网络上对此是否有很好的解释。基本的抽象ostream正在格式化文本输出。您给它一个intdouble(或用户定义的类型,稍后会介绍),
将其转换为char类型的字符流。它能做什么
该流取决于附加到它的streambuf
这是策略模式的一个示例,其中streambuf
策略的抽象基类[1]。该标准提供了两个streambuffilebufstringbuf的实现;在实践中,
在除最琐碎的应用程序之外的所有应用程序中,您可能都会
你实现自己。

输出时,始终使用ostream;这是上课的
定义了<<运算符。您正在将数据格式化为流
字符,而您实际上并不关心流在哪里结束。

创建实例时:如果创建ostream,则必须提供
自己加上streambuf。通常,您将创建一个ofstreamostringstream。这些都是“便利”类(class),
衍生自ostream,并为其提供streambuf(filebufstringbuf)。实际上,他们所做的就是
提供必要的streambuf(这会影响构造函数和
析构函数,其他没有太多);在ofstream的情况下,
还有一些额外的功能,可以转发到filebuf接口(interface)。

定义自己的方法时很常见(但不需要)streambuf提供ostream的便利重载(和istream(如果相关),与ofstream相同,或ostringstream

同样,创建实例时,通常使用以下方法之一
“便捷”派生类,而不是直接使用ostream并提供您自己的streambuf。

如果这一切看起来都很复杂:iostream类仅使用
关于C++的所有功能(虚拟函数,模板和
函数重载都起着重要作用)。如果你只是
在学习C++时,不必太担心:只需使用ofstream
构造实例但传递时的ostringstreamostream的引用。当您了解虚拟技术时
函数,模板和运算符重载,返回到iostream
了解它们在使代码更灵活方面所扮演的角色。

[1]由于各种原因,std::streambuf实际上不是抽象的。但
虚拟功能的实现是无用的;
提取总是返回EOF,插入总是失败。

10-08 03:54
查看更多