输入 EOF 后,不能重复使用 cin 来读取值

After enter EOF, cannot reuse cin to read values

本文关键字:cin 读取 EOF 不能 输入      更新时间:2023-10-16

我正在尝试读取几个整数,直到点击 eof(ctrl+d),然后读取其他一些整数,但cin不再起作用。

#include <iostream>
using namespace std;
int main()
{
    int c;
    while(cin >> c)
        cout << c << endl;
    int b;
    cin.clear();
    cin.ignore();
    cin >> b;
    cout<< "bla" << b << "ss" << endl; 
}

输出:(输入"2"后,我按 ctrl+D)

:! ./test
1
1
2
2
bla32767ss

如何解决这个问题?

Ctrl-D使标准输入报告 EOF 保持打开状态。您可以在 EOF 之后重用std::cin,如以下简单程序所示:

#include <iostream>
#include <string>
int main()
{
    for (;;)
    {
        for (std::string s; std::cin >> s; )
        {
            std::cout << "Got token: " << s << "n";
        }
        std::cin.clear();
        std::cout << "Received EOFn";
    }
}

现在,在解析整数时,可能会出现解析错误。在这种情况不是 EOF,而是处于"失败"状态。您还需要清除错误,但还需要丢弃不可分析的值。为此,您需要ignore

#include <iostream>
#include <limits>
int main()
{
    for (;;)
    {
        for (int n; std::cin >> n; )
        {
            std::cout << "Got integer: " << n << "n";
        }
        if (std::cin.eof())
        {
            std::cout << "Received EOFn";
            std::cin.clear();
        }
        else
        {
            std::cout << "Parsing failuren";
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
        }
    }
}

您在使用 ignore 时犯了双重错误:您只忽略了一个字符,即使输入可能包含多个不可解析的字符,并且您忽略了 EOF,而不是下一个换行符:那是因为ignore()有默认参数,ignore()ignore(1, EOF)相同。