当我阅读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
?
答案 0 :(得分:3)
std::basic_ios::clear
函数在我看来是错误命名的。它实际上设置你传递给它的标志。
清除例如一切,你实际上不必传递任何标志,它默认为std::ios_base::goodbit
。