cout<<字符串流

时间:2012-01-11 09:21:39

标签: c++ stringstream

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

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

看起来下面的评论命中了它,但这是我正在尝试做的事情:

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

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

4 个答案:

答案 0 :(得分:22)

您的想法

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或指针。

答案 1 :(得分:19)

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

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

cout << stream.str();

答案 2 :(得分:5)

是的,它很可能是某种形式或其他形式的记忆位置。很可能它是指向stringstream对象本身的指针。

您可以按照以下方式确认:

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

那就是说当你想要一个字符串流时,你应该使用str()函数,如下所示:

cout << ss.str();

答案 3 :(得分:2)

cout << s.rdbuf();

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

count << s.str();

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