区别stringstream和ostringstream

时间:2013-08-15 11:01:32

标签: c++

我正在尝试下面的代码片段,但它没有提供所需的输出:

#include<iostream>
#include<sstream>
using namespace std;
void MyPrint(ostream& stream)
{
    cout<<stream.rdbuf()<< endl;
}
int main()
{
    stringstream ss;
    ss<<"hello there";
    MyPrint(ss);                //Prints fine

    ostringstream oss;
    oss<<"hello there";
    MyPrint(oss);               //Does not print anything
    getchar();
}

我知道stringstreamostringstream之间唯一可能的差异是后者强制方向并且比stringstream稍快一些。

我错过了什么吗?

PS:之前发布了一个类似的问题,但没有得到任何答案。

2 个答案:

答案 0 :(得分:21)

std::stringstreamstd::ostringstream传递不同 std::stringbuf的标志。特别是 std::stringbuf的{​​{1}}不支持 读。 std::ostringstream是一个读操作 在streambuf上。

std::cout << stream.rdbuf()中提取字符的方法是 使用std::ostringstream函数。

答案 1 :(得分:0)

stringstream不应该被认为是ostringstream和istringstream的双向实现。它被实现为ostringstream和istringstream的开源类,这就是它实现输入和输出功能的原因。

选择使用哪一个取决于它的用途。如果您只需要在流上写入数据而无法通过流访问数据,那么您只需要一个ostringstream。但是,如果您想对您提供给API的内容实施双向但限制它,您可以将其强制转换:

stringstream ss;  // My bidirectional stream

ostringstream *p_os = &ss;  // Now an output stream to be passed to something only allowed to write to it.

int bytes = collectSomeData(p_oss);