作为一名初学程序员,我试图理解我书中的所有内容,但是我在理解这段代码方面遇到了一些问题,我已经写过这些代码来查看它的行为。
假设我想将数据读入字符串,清理这些数据然后放入"清理后的#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流,而且我遇到了一些问题。谢谢你的帮助
答案 0 :(得分:1)
您的信息流绝对可能处于eof和失败状态。当您尝试读取流的末尾时会发生这种情况。在您完成从中读取所有内容后,这是流的正确状态,并测试了没有任何内容。
这正是你的循环所做的,这是绝对可以的。当您的流定位超过其最后一个字符时,尚未设置eof标志。一旦你尝试阅读更多内容,它就会被设置。这是设计的。一旦你读了更多,eof和失败的标志都会被设置,这会导致循环终止,正如预期的那样。
答案 1 :(得分:0)
您正在通过operator bool
检查流状态;现在返回!this.fail()
true
如果设置了failbit
或badbit
,而不是eofbit
。
当您到达EOF(即正在读取流的末尾)时,>>
和<<
的{{3}}将设置eofbit
和< / em> failbit
。
如何在输入操作后正确找到流的真实状态?
您已经采用正确的方式,即通过operator bool
- 您可能想要进一步了解它behavior iostate
- s及其访问者。< / p>