gpt4 book ai didi

c++ - 进入EOF后,不能再用cin读取值

转载 作者:行者123 更新时间:2023-11-28 06:18:16 24 4
gpt4 key购买 nike

我正在尝试读取几个整数直到点击 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 EOF\n";
}
}

现在,在解析整数时,可能会出现解析错误。在那种情况下,流不是 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 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).

关于c++ - 进入EOF后,不能再用cin读取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29818585/

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