如何忽略所有 cin 错误并继续读取输入

How to ignore all cin errors and continue reading inputs

提问人:moriaz 提问时间:4/4/2022 最后编辑:wohlstadmoriaz 更新时间:2/21/2023 访问量:92

问:

我正在尝试编写一段代码,该代码可以连续从输入()中读取。它应该忽略可能的错误并继续读取下一个输入。cin

目前,我知道可能发生的两个错误:EOF (Ctrl + D),或输入字符而不是数字。

这是代码的简化摘录,但是当我按 Ctrl + D 时,它不起作用。

int ival;
int i = 0;
while(true)
{
    cout << i++ << ": ";
    cin >> ival;
    
    if (!cin.good()) 
    {
        cin.clear(); 
        if (cin.eof()) clearerr(stdin);
        cin.ignore(10000,'\n');
    }
    else
        cout << ival << endl;
}

我已经检查了以下帖子和其他一些类似的帖子。但是,它们中的每一个一次只处理其中一个错误。

清除和忽略清除。

我还尝试了错误处理部分中语句的各种排列,但仍然不成功。

C++ 错误处理 IOTreate

评论

2赞 Eljay 4/4/2022
我怀疑您的操作系统或终端程序将 Ctrl+D 解释为文件结尾。
0赞 molbdnilo 4/4/2022
一旦到达终点,您通常无法在标准输入上“重置并继续前进”。

答:

0赞 moriaz 2/21/2023 #1

这是一段处理 EOF(Ctrl+D) 和错误输入的代码。它继续读取输入并忽略无效的输入。

int ival;
for (int i = 0; i < 5; ++i) {
    cin >> ival;
    /*
    if (cin.fail()) cout << "fail" << endl;
    if (cin.eof()) cout << "eof" << endl;
    if (cin.bad()) cout << "bad" << endl;
    if (cin.good()) cout << "good" << endl;
    */

    if (!cin.good()) {
        if (cin.eof()) { //EOF = Ctrl + D
            clearerr(stdin);
            cin.clear(); //this must be done after clearerr
        }
        else { //This handels the case when a character is entered instead of a number
            cin.clear(); //
            cin.ignore(10000,'\n');
        }
    }
    else
        cout << ival << endl;
}