cout << stringstream

问题描述 投票:21回答:4

[当我将某些内容放入字符串流时,请说一个实数,如果我然后将该字符串流对象插入cout中……我在看什么?

通常,我得到一个奇怪的数字。这是存储位置吗?只是好奇。

看起来好像下面的评论击中了,但这是我想要做的:

string stringIn; 
stringstream holdBuff;
holdBuff << getline(cin, stringIn);
cout << holdBuff; 

基本上,我只是想看看插入stringIn后的holdBuff是什么样子。我试图让用户输入一个字符串,然后我想逐步查看它的内容并可能转换...

c++ stringstream
4个回答
24
投票

您的想法

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::stringstreamstd::ostringstream更合适时,您也可以执行以下操作:

std::cout << holdBuf.rdbuf();

但是,第一种解决方案更可取,因为它更加惯用。

无论如何,再次没有<<运算符会接受iostream类型,因此最终得到隐式结果转换为bool或指针。


23
投票

是,您可能会看到字符串流的地址。

如果要显示它包含的字符串,请尝试

cout << stream.str();

6
投票

是,很可能是某种形式或其他形式的存储位置。最有可能是指向stringstream对象本身的指针。

您可以通过以下方式确认这一点:

std::stringstream ss;
unsigned long long ll = (unsigned long long)&ss;
cout << ll;

也就是说,当您要退出字符串流时,应按以下方式使用str()函数:

cout << ss.str();

3
投票
cout << s.rdbuf();

是您想要的。另外,您可能想要

cout << s.str();

尽管在资源上可能更昂贵。

© www.soinside.com 2019 - 2024. All rights reserved.