#include <iostream>
#include <stdexcept> //runtime_error在其中定义
using namespace std;
int main(){
int ival;
while(cin>> ival,!cin.eof()){
if (cin.bad())
throw runtime_error("IO stream corrupted");
if (cin.fail()){
cerr << "bad data ,try again";
cin.clear(istream::failbit);
continue ;
}
}
return 0;
}
我输入 w 后 流处于错状态, cin.clear(istream::failbit)语句清理输入 流 的 错误信息,使流重新有校,但是程序运行时却是一直错误,那是因为错误字符w一直在缓冲区中,并没有被清除 ,cin每次从缓冲区中读入错误信息 ,即使流状态纠正,下次读取还会出错,所以程序运行时一直在错误的死循环中,但是加了两个getchar()后就好了:
#include <iostream>
#include <stdexcept> //runtime_error在其中定义
using namespace std;
int main(){
int ival;
while(cin>> ival,!cin.eof()){
if (cin.bad())
throw runtime_error("IO stream corrupted");
if (cin.fail()){
cerr << "bad data ,try again";
getchar();
getchar();
cin.clear(istream::failbit);
continue ;
}
}
return 0;
}
第一个getchar()用于清空输入缓冲区中的错误字符w,第二个getchar()用于清空输入缓冲区中的回车符'\n' (在输入完w后,按的回车),这样输入缓冲区就能被清空,但是如果只有用一个getchar()也能解决问题,那一个getchar()和两个getchar()有什么区别?
用一个getchar(),那么输入缓冲区中还会剩下一个回车符,那时流已经处于正常状态,但是cin有个特性,他会忽略前导回车符,就是cin从缓冲区中读取数据时,如果缓冲区开头是回车符'\n'
那么cin会忽略,无论有多少个回车符,只要在缓冲区开头且连续,cin都会忽略。所以用一个getchar()也能解决问题;
如果不用getchar(),用cin.ignore(1,' '),也能解决问题(原理和一个getchar()类似),但是cin.ignore(1,' ')必须放对位置,如果放在cin.clear(istream::failbit)前是没有用的,必须放在cin.clear(istream:failbit)后面,因为放在前面的话,那时后流还处于 错误状态,cin.ignore(1,' ')不会有作用,必须在流处于正确状态才有用。
#include <stdexcept> //runtime_error在其中定义
using namespace std;
int main(){
int ival;
while(cin>> ival,!cin.eof()){
if (cin.bad())
throw runtime_error("IO stream corrupted");
if (cin.fail()){
cerr << "bad data ,try again";
cin.clear(istream::failbit);
continue ;
}
}
return 0;
}
我输入 w 后 流处于错状态, cin.clear(istream::failbit)语句清理输入 流 的 错误信息,使流重新有校,但是程序运行时却是一直错误,那是因为错误字符w一直在缓冲区中,并没有被清除 ,cin每次从缓冲区中读入错误信息 ,即使流状态纠正,下次读取还会出错,所以程序运行时一直在错误的死循环中,但是加了两个getchar()后就好了:
#include <iostream>
#include <stdexcept> //runtime_error在其中定义
using namespace std;
int main(){
int ival;
while(cin>> ival,!cin.eof()){
if (cin.bad())
throw runtime_error("IO stream corrupted");
if (cin.fail()){
cerr << "bad data ,try again";
getchar();
getchar();
cin.clear(istream::failbit);
continue ;
}
}
return 0;
}
第一个getchar()用于清空输入缓冲区中的错误字符w,第二个getchar()用于清空输入缓冲区中的回车符'\n' (在输入完w后,按的回车),这样输入缓冲区就能被清空,但是如果只有用一个getchar()也能解决问题,那一个getchar()和两个getchar()有什么区别?
用一个getchar(),那么输入缓冲区中还会剩下一个回车符,那时流已经处于正常状态,但是cin有个特性,他会忽略前导回车符,就是cin从缓冲区中读取数据时,如果缓冲区开头是回车符'\n'
那么cin会忽略,无论有多少个回车符,只要在缓冲区开头且连续,cin都会忽略。所以用一个getchar()也能解决问题;
如果不用getchar(),用cin.ignore(1,' '),也能解决问题(原理和一个getchar()类似),但是cin.ignore(1,' ')必须放对位置,如果放在cin.clear(istream::failbit)前是没有用的,必须放在cin.clear(istream:failbit)后面,因为放在前面的话,那时后流还处于 错误状态,cin.ignore(1,' ')不会有作用,必须在流处于正确状态才有用。