【问题标题】:What is the return value of "stringstream>>something"?“stringstream>>something”的返回值是多少?
【发布时间】:2017-01-13 19:12:15
【问题描述】:

stringstream >> something 的返回值是多少?比如stringstream_obj >> int_obj的返回值。我知道由于istream& operator>> (int& val),返回类型仍然是流。但是有什么价值呢?具体来说,这是我的代码。

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main (void)
{
    stringstream sss(string("0"));
    int num;
    if (sss >> num) // don't understand here
        cout << "true" << endl;
    else 
        cout << "false" << endl;
    //output "true"    
    return 0;
}

作为评论,为什么输出为真? sss 仅包含 1 个字符。一旦“sss >> num”,返回的“stringstream”应该有空内容,因此括号的值应该是false。

赞赏,

【问题讨论】:

    标签: c++ stringstream


    【解决方案1】:

    operator&gt;&gt; 如您所说,返回对流的引用。然后,在if 的上下文中,流通过conversion operator 转换为bool,它给出:

    如果流没有错误则为 true,否则为 false。

    您成功读取了“0”,因此流没有错误,尝试再次读取,您将看到流有错误,if(sss) 的计算结果为 false

    【讨论】:

    • 谢谢@GillBates。在这里,我对 stringstream 的失败状态及其错误感到有些困惑。由于 sss 的内容被“sss >> num”“耗尽”,因此 sss 进入失败状态,从而阻止进一步使用该流对象。失败状态是否被认为是错误?或者它们有什么不同?
    • @leonardo_zz - 读取成功提取了一个数字,所以它没有失败。 sss.eof() 可以检查它也达到 eof 的事实,但它本身并不是错误。
    • 谢谢@BoPersson。我了解读取成功提取“0”。令我困惑的是字符串流的“失败状态”一词,如the fail state 所示。一旦 stringstream 的内容被耗尽(即达到 eof),就会触发失败状态,尽管最后一个字符被成功提取。在失败状态下,无法再写入字符串流。似乎这种失败状态不被认为是错误。我对么?赞赏
    • 到达流的末尾不会自动设置失败状态。它只是结束当前读取。如果这对当前类型有效,那么它就是成功状态。如果这对当前类型无效,则设置失败位。 sss &gt;&gt; num 将读入 0,到达末尾,这是有效的,所以它不是失败状态。如果您第二次执行sss &gt;&gt; num,它将在最后没有读取任何内容,这是无效的,因此 that 将设置失败位。
    • @MooingDuck 是的朋友,我的回答就是这个意思。
    【解决方案2】:

    在 c++ 中,通常当&gt;&gt; 与流一起使用时,它会返回自身

    http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

    在您的情况下,运算符>> sss &gt;&gt; num 返回 sss

    (我假设您使用的是 c++11,它看起来像)

    然后你的 sss 又名 stringstream 有一个 bool operator 如果转换成功则返回 true

    总之,if 语句更像

    if( convert sss to int and check if successful)
    // success
    else
    // fail
    

    这是一个很好的讨论,你可以阅读 http://www.cplusplus.com/forum/articles/6046/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-06
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2020-12-13
      相关资源
      最近更新 更多