C ++:ostream和ostringstream有什么区别?

时间:2012-08-21 12:03:56

标签: c++ ostream ostringstream

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

4 个答案:

答案 0 :(得分:17)

简明扼要地说:ostringstream提供streambufostream 要求用户提供一个。

要理解其含义,有必要了解一点 流是如何工作的(和其他一些海报不同,我不确定 在网上有一个很好的探索)。基本的抽象 ostream的格式化文本输出。你给它一个int或者一个 double(或用户定义的类型 - 稍后更多),以及它 将其转换为char类型的字符流。它能做什么 该流取决于附加到它的streambuf; 这是策略模式的一个示例,其中streambuf是一个 策略的抽象基类[1]。该标准提供了两个 streambuffilebufstringbuf的实现;在实践中, 在除了最简单的应用程序之外的所有应用程序中,您可能会有一些 你自己实现了。

输出时,您始终使用ostream;这是班级 <<运算符已定义。您正在将数据格式化为流 字符,你并不关心流最终的位置。

创建实例时:如果您创建ostream,则必须提供 它自己streambuf。更常见的是,你会创建一个 ofstreamostringstream。这些都是“便利”类, 派生自ostream,并为其提供streambuffilebufstringbuf,正好相反)。实际上,他们所做的所有都是 提供必要的streambuf(它影响构造函数和 析构函数,而不是其他);在ofstream的情况下,那里 也是一些额外的功能,转发到其他功能 filebuf界面。

当你定义自己的时候,通常(但绝不是必需的) streambuf提供ostream的便利重载(和{ istream,如果相关的话),与ofstreamostringstream

出于同样的原因,在创建实例时,通常使用其中一个 “方便”派生类,而不是直接使用ostream 并提供你自己的streambuf。

如果所有这些看起来很复杂:iostream类只使用 关于C ++的所有功能(虚拟功能,模板和 函数重载都起着重要的作用)。如果你只是 学习C ++,不要太担心它:只需使用ofstreamostringstream当你构造一个实例时,但是传递一下 对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

enter image description here

答案 2 :(得分:5)

ostream更通用(子类支持写入不同的地方),ostringstream是写入string

的具体内容

答案 3 :(得分:4)

ostream背后没有rdbuf实现,而ostringstream使用了stringbuf。试过文件?