18

ostream 和 ostringstream 有什么区别?您什么时候会使用其中一种?

4

4 回答 4

35

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

要了解其中的含义,有必要了解一点流的工作原理,我不确定 Web 上是否对此有很好的解释。的基本抽象ostream是格式化文本输出。你给它一个intor a double(或一个用户定义的类型——稍后会详细介绍),它会将它转换成一个字符流,类型为char。它对该流的作用取决于streambuf附加到它的哪个;这是策略模式的一个示例,其中streambuf是策略的抽象基类[1]。该标准提供了和的两种实现streambuf;在实践中,除了最琐碎的应用程序之外,您可能会拥有一些您自己实现的应用程序。filebufstringbuf

输出时,您总是使用ostream; 它 <<是定义运算符的类。您正在将数据格式化为字符流,而您并不真正关心流的最终位置。

创建实例时:如果创建ostream,则必须streambuf自己提供。更多时候,您会创建一个 ofstream或一个ostringstream. 这些都是“便利”类,它们派生自ostream,并streambuf为它提供了一个(filebuf 并且stringbuf,碰巧)。实际上,他们所做的只是提供必要的streambuf东西(这会影响构造函数和析构函数,而不是太多);在 的情况下ofstream,还有一些额外的功能转发到filebuf界面中的附加功能。

streambuf当您定义自己的以提供ostream(和 istream,如果相关)的便利重载时,通常(但绝不要求) 与ofstreamor 相同ostringstream

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

如果这一切看起来很复杂:iostream 类几乎使用了 C++ 的所有功能(虚拟函数、模板和函数重载都起着重要作用)。如果您只是在学习 C++,请不要太担心:只需在构造实例时使用ofstreamor ostringstream,但将引用传递给ostream. 当您了解虚拟函数、模板和运算符重载等技术时,请返回 iostream 以了解它们在使代码更灵活方面所起的作用。


[1] 由于种种原因,std::streambuf实际上并不抽象。但是其中的虚函数的实现是没有用的;提取总是返回 EOF,插入总是失败。

于 2012-08-21T14:16:47.633 回答
14

这是 C++ 流类的继承层次结构的好视图:) 该部分的这篇文章 3.1 ofstream and ostringstream有你需要的东西。

本质上:ofstream类使之成为可能,write data to files using stream operationsostringstream类使之成为可能write to strings

在此处输入图像描述

于 2012-08-21T12:19:26.567 回答
6

ostream更通用(子类支持写到不同的地方),ostringstream是一个特定的写到一个string

于 2012-08-21T12:05:36.693 回答
3

ostream它背后没有rdbuf实现,而ostringstream使用 stringbuf。尝试过文档?

于 2012-08-21T12:05:41.997 回答