我正在尝试下面的代码片段,但它没有提供所需的输出:
#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:之前发布了一个类似的问题,但没有得到任何答案。
答案 0 :(得分:21)
std::stringstream
和std::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);