读取超出 istringstream 字符串末尾的内容。

Reading beyond the end of an istringstream's string.

本文关键字:istringstream 字符串 读取      更新时间:2023-10-16

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

假设我想将数据读取到一个字符串中,清理这些数据,然后将"清理过的"数据放入一个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之后的流,得到它都处于of()状态fail()状态。流有可能同时处于这两种状态吗?为什么我会得到这个结果?如何在输入操作后正确地找到流的真实状态?我刚开始学习I/O流,遇到了一些问题。感谢您的帮助

您的流肯定有可能同时处于eof和失败状态。当你试图阅读超过流的末尾时,就会发生这种情况。这是在您完成从流中读取的所有内容并测试没有任何内容后流的正确状态。

这正是你的循环所做的,这样做是完全可以的。当你的流的位置超过了它的最后一个字符时,eof标志还没有设置。只要你试着多读一些,它就会被设置好。这是经过设计的。一旦您阅读了更多内容,就会设置eof和failed标志,这将导致循环终止,正如预期的那样。

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

当您到达EOF(即读取超过流的末尾)时,>><<的行为是设置eofbitfailbit

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

您已经在以正确的方式进行操作,即通过operator bool——您可能想做的是查找iostate及其访问器来进一步了解它。