输入 EOF 后,不能重复使用 cin 来读取值
After enter EOF, cannot reuse cin to read values
我正在尝试读取几个整数,直到点击 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)
相同。
相关文章:
- 从 cin 读取不会返回整个输入字符串
- 使用 cin 读取空行
- 为什么从 std::cin 读取输入后右括号字符的值有时不是")"?
- 如何从 cin 读取直到输入非数字内容?
- 如何从文件中读取,然后继续从cin读取?
- 使用 cin 读取大型输入时程序冻结
- 使用 cin 读取逗号分隔的整数对 (x,y) 和任意空格
- 从 cin 读取 PNG 文件
- 从cin读取不同类型的输入
- 将大写字母(从 cin 读取)更改为小写
- 如何超载CIN读取文件
- 多次从 std::cin 读取 -- Linux 和 Mac OS X 上的行为不同
- 如何清除cin读取的内容
- 我希望 cin 读取直到'n'但我无法使用 getline
- 如何终止从 cin 读取
- 将 getline 从 cin 读取到字符串流 (C++)
- 使用 cin 读取字符串时出错
- 如何使用 cin 读取带有空格的输入,直到到达制表符
- 是否可以从 cin 读取空字符串,并且仍然可以从 cin.good() 中获取 true
- 使用cin读取格式化输入