【问题标题】:Reading beyond the end of an istringstream's string.读取超出 istringstream 字符串的末尾。
【发布时间】:2016-08-08 08:50:33
【问题描述】:

作为一名初级程序员,我试图理解我书中的所有内容,但在理解我为查看其行为而编写的这段代码时遇到了一些问题。

假设我想将数据读入一个字符串,清理这些数据,然后将“清理”的数据放入一个 istringstream 中,以便我可以再次读取它:

string line; 
getline(cin, line); 

// clean up data....

istringstream ss(line);
vector<string> vs; 
for (string word; ss >> word; )
    vs.push_back(word); 

现在,通过编写这段代码,我想起了我书中的一句话:

如果您尝试读取超出 istringstream 字符串末尾的内容,它将进入 eof() 状态。

所以我尝试用两个if 条件测试for loop 之后的流,我发现它同时处于eof() 状态fail() 状态。流是否有可能同时处于这两种状态?为什么我会得到这个结果?输入操作后如何正确找到流的真实状态?我刚刚开始学习 I/O 流,但遇到了一些问题。谢谢你的帮助

【问题讨论】:

    标签: c++ input error-handling


    【解决方案1】:

    您的流绝对有可能同时处于 eof 和失败状态。当您尝试阅读流的末尾时会发生这种情况。这是您从流中读取完所有内容并测试没有任何内容后的正确状态。

    这正是您的循环所做的,而且这样做绝对没问题。当您的流定位超过其最后一个字符时,尚未设置 eof 标志。只要您尝试阅读更多内容,它就会被设置。这是设计使然。一旦您阅读了更多内容,就会设置 eof 和 failed 标志,这会导致循环终止,正如预期的那样。

    【讨论】:

    【解决方案2】:

    您正在通过operator bool 检查流状态;现在返回!this.fail(),如果设置了failbitbadbit,则返回true,而不是eofbit

    当您到达 EOF(即读取超过流末尾)时,&gt;&gt;&lt;&lt;behavior 将设置 eofbit failbit

    如何在输入操作后正确找到流的真实状态?

    您已经以正确的方式进行操作,即通过operator bool - 您可能想要进一步了解它的是looking up iostate-s 及其访问器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多