2012-01-11 116 views
14

当我把一些东西放到一个stringstream中时,让我们说一个实数,如果我然后将该stringstream对象插入到cout中...我在看什么?cout << stringstream

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

它看起来像下面的评论打它,但这里是我想要做的事:

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

基本上我只是想看看有什么holdBuff看起来像有一次我插入stringIn。我试图让用户输入一个字符串,然后我想通过它寻找它的内容和可能转换...

回答

19

你觉得呢

holdBuff << getline(cin, stringIn); 

正在做。在这种情况下,返回类型getline是对正在读取的流 的引用(cin)。因为没有定义<<其中 接受一个std::istream作为第二个参数,编译器试图不同 转化:在C++ 11,std::istream具有隐式转换到 bool,并且在较早的C++,一个隐式转换到std::ios*,或 东西类似(但是返回值的唯一有效用途是将其转换为) 。因此,您将输出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或指针。

+0

非常感谢詹姆斯。伟大的信息。我将不得不查找ostringstream与stringstream之间的区别。这是一种好的/入门级的方式来拉入一系列可能的混合类型吗?谢谢。 – MCP 2012-01-12 07:46:17

2
cout << s.rdbuf(); 

是你想要的。或者,你可能想要

count << s.str(); 

虽然它可能在资源方面更昂贵。

13

是的,你很可能会看到stringstream的地址。

如果你想显示它包含字符串,尝试

cout << stream.str(); 
+0

由于str()按值返回,因此会创建缓冲区的副本。 – 2012-01-11 17:50:49

5

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

你能否确认这个消息如下:

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

时要清点一个字符串流,你应该按如下方式使用STR()函数,它说:

cout << ss.str(); 
相关问题