C++中cin.clear()的用法

我们谈谈cin.clear的作用,第一次看到这东西,很多人以为就是清空cin里面的数据流,而实际上却与此相差很远,首先我们看看以下代码:

#include <iostream> 

using namespace std; 

int main()  

{         

    int a;         

    cin>>a;         

    cout<<cin.rdstate()<<endl;         

    if(cin.rdstate() == ios::goodbit)   

    {   

        cout<<"输入数据的类型正确,无错误!"<<endl;               

    }         

    if(cin.rdstate() == ios_base::failbit)         

    {                 

        cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl;         

    }         

    system("pause"); 

}

我们定义要输入到的变量是整型,但如果我们输入了英文字母或者汉字,那就会发生错误,cin里有个方法能检测这个错误,就是cin.rdstate(); 当cin.rdstate()返回0(即ios::goodbit)时表示无错误,可以继续输入或者操作,若返回4则发生非致命错误即ios::failbit,则不能继续输入或操作.而cin.clear则可以控制我们此时cin里对这个问题的一个标识.语发如下: cin.clear(标识符); 标识符号为:

goodbit 无错误 
Eofbit 已到达文件尾 
failbit 非致命的输入/输出错误,可挽回 
badbit 致命的输入/输出错误,无法挽回 若在输入输出类里.需要加ios::标识符号 
通过cin.clear,我们能确认它的内部标识符,如果输入错误则能重新输入.结合真正的清空数据流方法cin.sync(),请看下例:

#include <iostream> 

using namespace std; 

int main()  

{         

    int a;         

    while(1)         

    {                 

        cin>>a;                 

        if(!cin)            //条件可改写为cin.fail()                 

        {                         

            cout<<"输入有错!请重新输入"<<endl;                         

            cin.clear();                          

            cin.sync();   //清空流                 

        }                 

        else

        {                         

            cout<<a;                         

            break;                 

        }         

    }         

    system("pause"); 

}

上面的cin.clear()默认参数为0,即无错误,正常操作.当我们输入英文字母‘k‘时,它的状态标识改为fail,即错误,用cout对用户输出信息,再用cin.clear让错误标识改回为0,让我们可以继续输入,再清空流数据继续输入.如果我们没有了cin.clear,则会进入死循环,其过程为我们输入了英文字母,它的状态标识便为fail,当运行到条件判断时,便总是回到错误的条件表示里,并且我们再也没办法输入,因为错误的表示关闭了cin,所以会进入死循环.

C++中cin.clear()的用法,布布扣,bubuko.com

时间: 2024-10-09 23:30:44

C++中cin.clear()的用法的相关文章

c++中cin的基本用法

一.最基本的用法cin>> 接收一个数字.字符.字符串,遇"空格"."TAB"."回车"都结束 例如: <span style="font-size:18px;"><span style="font-size:18px;">#include <iostream> using namespace std; main () { int a,b; cin>&g

C++中cin的用法汇总

cin可以用于接收输入,最常见的是从控制台接收.在刚学习C++的时候经常会用cin来接收数据,这里想要系统的总结一下cin的用法,保证不灌水. C++中的cin是一个 istream对象,从标准输入中读取数据,在iostream头文件中定义. 流对象不能拷贝或赋值.此外,读写一个IO对象都会改变其状态,因此传递和返回的引用都不能是const的,否则无法读写. cin的条件状态 IO流有四种条件状态,分别用位来控制. cin.badbit : 001   1   表示系统级错误,一旦被置为该状态,

C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法(转)

学C++的时候,这几个输入函数弄的有点迷糊:这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行) 1.cin 2.cin.get() 3.cin.getline() 4.getline() 5.gets() 6.getchar() 附:cin.ignore();cin.get()//跳过一个字符,例如不想要的回车,空格等字符 1.cin>>          用法1:最基本,也是最常用的用法,输入一个数字: #includ

C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法

C++中cin.cin.get().cin.getline().getline().gets()等函数的用法 学C++的时候,这几个输入函数弄的有点迷糊:这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行) 1.cin 2.cin.get() 3.cin.getline() 4.getline() 5.gets() 6.getchar() 附:cin.ignore();cin.get()//跳过一个字符,例如不想要的回车,空

cin.ignore()的用法 cin.clear() cin.setstate()

cin.ignore() basic_istream& ignore(streamsize _Count = 1, int_type _Delim = traits_type::eof());function: Causes a number of elements to be skipped from the current read position.Parameters:_Count, The number of elements to skip from the current read

c++中cin和cout的用法

cin和cout是c++中的标准输入输出流.中 一.cin cin的一般用法: cin>>变量a>>变量b>>变量c; cin会自动辨别变量的类型,如a可以是char,b可以是int,c可以是float. 原文地址:https://www.cnblogs.com/jxxclj/p/9251272.html

[转]cin.clear()、cin.sync()和cin.ignore()的用法

cin.clear()是用来更改cin的状态标识符的. cin.sync()是用来清除缓冲区的数据流的. 如果标识符没有改变那么即使清除了数据流也无法正常输入,反之亦然,因此两者要联合起来使用.下面是一个使用的例子: #include<iostream> using namespace std; int main() { int a; cout<<"输入一个字母:"<<endl; cin>>a; //int型变量中放了char型数据,fa

C++ cin输入流 详细用法

我们来看下下面这段代码: #include <iostream> #include <vector> #include <cstdlib> int main() { int num = 0; std::vector<int> ivec; do { std::cout << "please input some numbers:" << std::endl; while (std::cin >> num)

STL中的Vector相关用法

STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int>是一种数据类型. Vector的存储空间是连续的,list不是连续存储的. 1. 定义和初始化 vector< typeName > v1; //默认v1为空,故下面的赋值是错误的v1[0]=5;//v2是v1的一个副本,若v1.size()>v2.size()则赋值后v2.size()被