gpt4 book ai didi

c++ - 如何清除IO状态?

转载 作者:行者123 更新时间:2023-11-30 02:47:27 25 4
gpt4 key购买 nike

当我阅读 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::eofbitline 20 ,虽然我测试了 is.eof()false在第 16 行?

最佳答案

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

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

关于c++ - 如何清除IO状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22758300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com