当使用cin输入时,如果想要输入的类型为int的,输入时输入成了字符,就会导致cin错误
#include <iostream>
#include <set>
using namespace std;
int main()
{
int a;
cin>>a;
while(cin.fail()){
cin.clear();
cout<<"输入错误!"<<endl;
cin.ignore(1024,'\n');
cin>>a;
}
cout<<a<<endl;
;
}
- cin.restate() 当cin.rdstate()返回0(即ios::goodbit)时表示无错误,可以继续输入或者操作,若返回4则发生非致命错误即ios::failbit,则不能继续输入或操作
- cin.fail() 可以判断流操作是否失败,输入错误后,cin.fail()返回为真 错误流标志位被置failbit为true, 当恢复时 failbit被设置为false
- cin.clear() (默认为0 ,即无错误)清除错误的标志位
clear有多种状态- goodbit 无错误
- Eofbit 已到达文件尾
- failbit 非致命的输入/输出错误,可挽回
- badbit 致命的输入/输出错误,无法挽回 若在输入输出类里.需要加ios::标识符号
- 通过设置cin.clear() 或 cin.clear(istream::goodbit)清除错误状态
- cin.ignore() 清除缓冲区
如果输入错误,通过cin.clear()清除了错误状态标志后,下一次cin输入时,仍会从缓冲区中读取数据,而之前的错误输入此时仍存在缓冲区中,所以还会再次被读取造成错误,所以要清空缓冲区
- cin.ignore(要清除的字节长度,标识)
cin.ignore(1024,’\n’)
该函数就是将选中的字节取出抛弃掉(cin操作时是以char为单位的)
标识清除的最大长度是1024个字节。
清除时如果遇到‘\n’就停止,不管是否是1024个字节。
如果没有遇到‘\n’就只清除1024个
cin.ignore()的默认参数为cin.ignore(1,EOF),及清除文件描述符前一个字节
- cin.sync() 也有清除缓冲区的功能