读取istringstream的字符串结尾。

时间:2016-04-16 10:45:14

标签: c++ input error-handling

作为一名初学程序员,我试图理解我书中的所有内容,但是我在理解这段代码方面遇到了一些问题,我已经写过这些代码来查看它的行为。

假设我想将数据读入字符串,清理这些数据然后放入"清理后的#34;数据进入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()状态并且失败()州。流是否可能处于这两种状态?为什么我得到这个结果?如何在输入操作后正确找到流的真实状态?我刚刚开始学习I / O流,而且我遇到了一些问题。谢谢你的帮助

2 个答案:

答案 0 :(得分:1)

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

这正是你的循环所做的,这是绝对可以的。当您的流定位超过其最后一个字符时,尚未设置eof标志。一旦你尝试阅读更多内容,它就会被设置。这是设计的。一旦你读了更多,eof和失败的标志都会被设置,这会导致循环终止,正如预期的那样。

答案 1 :(得分:0)

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

当您到达EOF(即正在读取流的末尾)时,>><<的{​​{3}}将设置eofbit 和< / em> failbit

  

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

您已经采用正确的方式,即通过operator bool - 您可能想要进一步了解它behavior iostate - s及其访问者。< / p>