【问题标题】:cout << stringstreamcout <<字符串流
【发布时间】:2012-01-11 09:21:39
【问题描述】:

当我将某些东西放入字符串流时,假设是一个实数,如果我随后将该字符串流对象插入 cout...我在看什么?

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

看起来下面的评论很成功,但这是我想要做的:

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

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

【问题讨论】:

    标签: c++ stringstream


    【解决方案1】:

    你怎么看

    holdBuff << getline(cin, stringIn);
    

    正在做。 getline 的返回类型是对流的引用 在这种情况下被读取(cin)。由于没有定义 &lt;&lt;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();
    

    然而,第一种解决方案更可取,因为它更惯用。

    无论如何,再一次,没有&lt;&lt; 运算符可以接受任何 iostream 类型,所以你最终得到了隐式的结果 转换为bool 或指针。

    【讨论】:

    • 非常感谢詹姆斯。很棒的信息。我将不得不查找 ostringstream 与 stringstream 之间的区别。这是引入一系列可能混合类型的好/入门级方法吗?谢谢。
    【解决方案2】:

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

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

    cout << stream.str();
    

    【讨论】:

    • 这会创建缓冲区的副本,因为 str() 按值返回。
    • @DavidFeurle 有什么办法不复制它,而是获取字符串流使用的底层缓冲区的地址?
    • @TamaMcGlinn 您可以使用函数 rdbuf 访问底层缓冲区。您无需复制即可将 rdbuf 直接流式传输到另一个流。但是您无法获得指向内部缓冲区的指针,因为 rdbuf 不需要以这种方式实现。但是,您可以实现自己的 rdbuf,它允许访问内部缓冲区。
    【解决方案3】:

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

    您可以通过以下方式确认:

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

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

    cout << ss.str();
    

    【讨论】:

      【解决方案4】:
      cout << s.rdbuf();
      

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

      cout << s.str();
      

      但在资源方面可能更昂贵。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多