如何清除IO状态?

时间:2014-03-31 09:40:11

标签: c++

当我阅读C ++ Primer 8.2时,我编写代码来传递非法数据。奇怪的是,当eof()为false时,我必须清除istream :: eofbit;

当我运行./a.out < test.data时。

数据永远循环以打印bad data, try again.

$ cat test.data

1 a 2

这是我的代码

  1 #include <iostream>
  2 #include <stdexcept>
  3 using namespace std;
  4 
  5 istream& getData(istream &is) {
  6 
  7     int num;
  8 
  9     try {
 10     while (is >> num, !is.eof()) {
 11         if (is.bad()) {
 12             throw std::runtime_error("IO stream corrupted.");
 13         }
 14 
 15         if (is.fail()) {
 16 //            cout << "fail " << is.eof() << endl;
 17 //           break;
 18             cerr << "bad data, try again." << endl;
 19             is.clear(istream::failbit); // can not clear eofbit which leads to loop forever
 20             is.clear(istream::eofbit);
 21             is.ignore(200, ' ');
 22             continue;
 23         }
 24 
 25         cout << num << " ";
 26     }
 27     } catch (const std::runtime_error& e) {
 28         cerr << "IO Exception." << endl;
 29     }
 30 
 31     cout << endl;
 32 
 33     is.clear();
 34     return is;
 35 }
 36 
 37 int main() {
 38 
 39     istream& is2 = getData(cin);
 40 
 41 //    getData(is2);
 42 
 43     return 0;
 44 }

为什么我必须在istream::eofbit中清除line 20,而我在第16行测试is.eof()false

1 个答案:

答案 0 :(得分:3)

std::basic_ios::clear函数在我看来是错误命名的。它实际上设置你传递给它的标志。

清除例如一切,你实际上不必传递任何标志,它默认为std::ios_base::goodbit