输入EOF后,无法重用cin来读取值

时间:2015-04-23 09:01:35

标签: c++

我试图读取几个整数,直到命中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; 
}

输出:(输入&#34; 2&#34;,我点击ctrl + D)

:! ./test
1
1
2
2
bla32767ss

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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 EOF\n";
    }
}

现在,在解析整数时,可能会出现解析错误。在这种情况下,流不是EOF,而是&#34;失败&#34;州。您还需要清除错误,但还需要丢弃不可解析的值。为此,您需要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 EOF\n";
            std::cin.clear();
        }
        else
        {
            std::cout << "Parsing failure\n";
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
    }
}

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