[当我将某些内容放入字符串流时,请说一个实数,如果我然后将该字符串流对象插入cout中……我在看什么?
通常,我得到一个奇怪的数字。这是存储位置吗?只是好奇。
看起来好像下面的评论击中了,但这是我想要做的:
string stringIn;
stringstream holdBuff;
holdBuff << getline(cin, stringIn);
cout << holdBuff;
基本上,我只是想看看插入stringIn后的holdBuff是什么样子。我试图让用户输入一个字符串,然后我想逐步查看它的内容并可能转换...
您的想法
holdBuff << getline(cin, stringIn);
正在做。返回类型getline
是对流的引用在这种情况下被读取(cin
)。由于没有定义<<
将std::istream
作为第二个参数,编译器尝试转换:在C ++ 11中,std::istream
隐式转换为bool
,以及在较早的C ++中,隐式转换为std::ios*
,或者类似的东西(但返回值的唯一有效用途是将其转换为bool
)。因此,您将输出1
(C ++ 11)或一些随机地址(实际上通常是流的地址,但是不保证)。如果您想获得呼叫的结果getline
转换为std::ostringstream
,您需要进行两项操作(检查它们之间的错误):
if ( !getline( std::cin, stringIn ) )
// Error handling here...
holdBuff << stringIn;
类似地,写入std::ostringstream
的内容,
std::cout << holdBuf.str() ;
是正确的解决方案。如果您坚持使用std::stringstream
当std::ostringstream
更合适时,您也可以执行以下操作:
std::cout << holdBuf.rdbuf();
但是,第一种解决方案更可取,因为它更加惯用。
无论如何,再次没有<<
运算符会接受iostream
类型,因此最终得到隐式结果转换为bool
或指针。
是,您可能会看到字符串流的地址。
如果要显示它包含的字符串,请尝试
cout << stream.str();
是,很可能是某种形式或其他形式的存储位置。最有可能是指向stringstream对象本身的指针。
您可以通过以下方式确认这一点:
std::stringstream ss;
unsigned long long ll = (unsigned long long)&ss;
cout << ll;
也就是说,当您要退出字符串流时,应按以下方式使用str()函数:
cout << ss.str();
cout << s.rdbuf();
是您想要的。另外,您可能想要
cout << s.str();
尽管在资源上可能更昂贵。