我试图读取几个整数,直到命中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
如何解决这个问题?
答案 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)
相同。