15

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

#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();
}

我知道stringstream和之间唯一可能的区别ostringstream是后者强制方向并且比stringstream.

我错过了什么吗?

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

4

2 回答 2

24

std::stringstream并将std::ostringstream不同的标志传递给std::stringbuf. 特别 std::stringbuf是 anstd::ostringstream不支持阅读。并且std::cout << stream.rdbuf()是对streambuf 的读操作。

从 an 中提取字符的方法std::ostringstream是使用std::ostringstream::str()函数。

于 2013-08-15T11:06:04.293 回答
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);
于 2013-08-15T11:10:38.423 回答