输出 << 字符串流

31

当我把一些东西放入stringstream中,比如一个实数,如果我然后将该stringstream对象插入到cout中...我看到的是什么?

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

下面的评论似乎命中了要点,但这是我正在尝试做的:

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

基本上我只是想看看在插入stringIn后holdBuff的样子。我正在尝试让用户输入一个字符串,然后我想逐步查找其内容并可能进行转换...

4个回答

29

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

如果你想显示它所包含的字符串,请尝试:

cout << stream.str();

1
这会创建缓冲区的副本,因为str()按值返回。 - David Feurle
1
@DavidFeurle 有没有什么方法可以不复制它,但是获取stringstream使用的底层缓冲区的地址? - TamaMcGlinn
1
@TamaMcGlinn,您可以使用函数rdbuf来访问底层缓冲区。您可以直接将rdbuf流式传输到另一个流中而无需复制。但是,您无法获取指向内部缓冲区的指针,因为rdbuf不需要以这种方式实现。但是,您可以实现自己的rdbuf,以允许访问内部缓冲区。 - David Feurle

28

你认为怎么样?

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

非常感谢你,詹姆斯。这是很好的信息。我需要查一下ostringstream和stringstream之间的区别。这是提取可能包含混合类型行的良好/入门级方法吗?谢谢。 - MCP

6
cout << s.rdbuf();

这是你想要的。或者你可能希望

cout << s.str();

虽然这可能会更耗费资源,但相应的成本会更高。


6

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

您可以按以下方式确认:

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

话虽如此,但是当您想要输出stringstream时,应使用以下的str()函数:

cout << ss.str();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接