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

kmc*_*coy 10 c++ ostringstream ostream

ostream和ostringstream有什么区别?你什么时候使用一个?

Jam*_*nze 18

简洁明了:ostringstream提供一个streambuf,ostream 要求用户提供一个.

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

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

创建实例时:如果创建实例ostream,则必须streambuf自己提供实例.更常见的是,你会创造一个 ofstream或一个ostringstream.这些都是"便利"类,它们来自ostream并提供streambuf它(filebuf 并且stringbuf,当它发生时).实事求是地讲,所有他们能做的就是提供必要的streambuf(影响构造函数和析构函数,而其他不是非常多); 在这种情况下ofstream,还有一些额外的功能可以转发到filebuf界面中的附加功能.

通常(但绝不是必需的)当您定义自己 streambuf以提供方便的重载ostream(和 istream,如果相关)时,沿着与ofstream或 相同的行ostringstream.

出于同样的原因,在创建实例时,通常使用"方便"派生类之一,而不是ostream直接使用并提供自己的streambuf.

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


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


Mim*_*EAM 10

这里是C++流类的继承层次结构的很好的视图:) 节的这篇文章 3.1 ofstream and ostringstream有你需要的.

本质上:ofstream该类使得它成为可能,write data to files using stream operations并且ostringstream该类使其成为可能write to strings.

在此输入图像描述

  • 在你的层次结构的底部有一些(明显的)错误:从 `iostream` 派生的类是 `fstream` 和 `stringstream`。(当然,在实践中,`fstream` 和 `stringstream` 几乎从不使用。) (3认同)

Grz*_*man 5

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