0
点赞
收藏
分享

微信扫一扫

清除缓冲流中数据相关一系列函数的简单介绍


一.cin.ignore()函数

cin.ignore(a,ch)方法是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则cin.ignore()函数执行终止;否则,它继续等待。

它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。比如可以这么用:

cin.ignore(1024,’\n’)

通常把第一个参数设置得足够大,这样实际上总是只有第二个参数’\n’起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。

默认参数

你不给参数,则默认参数为cin.ignore(1,EOF),即把EOF前的1个字符清掉,没有遇到EOF就清掉一个字符然后结束,就是这样啊,所以你每次都少一个字符.

二.cin.clear()

作用:

cin.clear()默认参数为0,即无错误,正常操作.

当我们输入英文字母’k’时,它的状态标识改为fail,即错误,用cout对用户输出信息,再用cin.clear让错误标识改回为0,让我们可以继续输入,再清空流数据继续输入.
​​​clear详细参考

​​clea详细​​

三.cin.rdstate()

作用 返回状态字

函数返回当前流对象的failbit、eofbit、badbit 3个标记位状态的加权值之和.
流状态有两种表示方法:
1、failbit,badbit,Eofbit组成了流状态
2、goodbit这个标记位是另一种流状态的表示方法
rdstate()函数会采用第一种方法,返回流状态的详细情况.
rdstate()函数的返回值进行输出,输出结果是一个由failbit,Eofbit,badbit这3个标记加权值相加的十进制数,而非这3个标记位各自的当前值.
其中这3个标记的加权值:
failbit=4
Eofbit=2
badbit=1
failbit,Eofbit,badbit分别位於二进制百位,十位,与个位.其每一个标记的有效值为1,无效值为0,例如:
failbit为有效值,同时Eofbit,badbit为无效值,则
cout << cin.fail() << cin.eof() << cin.bad();执行结果为100,其加权值相加等於14+02+01=4,则执行cout << cin.rdstate();输出结果为4.
例如:
failbit与Eofbit为有效值,同时badbit为无效值,则
cout << cin.fail() << cin.eof() << cin.bad();执行结果为110,其加权值相加等於1
4+12+01=6,则执行cout << cin.rdstate();输出结果为6.
例如:
failbit,Eofbit与badbit 3者同时为有效值,则
cout << cin.fail() << cin.eof() << cin.bad();执行结果为111,其加权值相加等於14+12+1*1=7,则执行cout << cin.rdstate();输出结果为7.

​​参考​​

四.cin.sync()

作用:清空流

​​http://www.cplusplus.com/forum/general/63860/​​

对于 std::cin 这些标准库「自带」的输入流来说,调用 sync() 是「实现定义」的行为

所以此处调了 sync() 以后清空、恢复原状、什么都不干都是可以的,如果没有得到预期的效果的话,可以查看自己的编译器(标准库实现)的说明文档,上面应该有写明它所使用的是哪种行为。

具体可以参考:cppreference.com
参考来自

​​cin.get()和cin.getline()函数​​

再讨论clear()和sync()搭配顺序重要性

在输入错误的情况下,先执行清空流,会发生下面的情况:

在流中fail()状态值无效的情况下,执行cin.sync(); 清空流是无效的,输入流中的数据依旧在(从错误开始那个,包括错误那个字符仍然在流中)。

测试代码:

#include <iostream>
using namespace std;
int main()
{
int a;
char c;

//错误状态开始
cout<<"输入字母:"<<endl; //输入ab4d4c试试
cin>>a; //由于输入的是字母,会出错
cout<<"cin.fail() = "<<cin.fail()<<endl; //因为输入出错,会输出1.
cout<<"a = "<<a<<endl; //没有输入成功,因此a是随机值
cout<<"\n\n";


cin.sync(); //在流中fail()状态值无效的情况下,执行cin.sync(); 清空流是无效的
cout<<"cin.sync()无效,cin.fail() = "<<cin.fail()<<endl; //流中fail标志位仍然是1.
cin>>a; //还是会读取'a',仍然出错
cout<<"\n\n";


cout<<"cin.sync()无效,cin.fail() = "<<cin.fail()<<endl; //因为输入出错,会输出1.
cout<<"a = "<<a<<endl; //输出和上面相同的随机值。
cin.sync(); //在流中fail()状态值为1的情况下,执行cin.sync(); 清空流是无效的
cout<<"\n\n";



//clear()+sync()联合的作用开始体现,需要在cin.sync()前,才能让它发挥作用
cin.clear(); //将流中的所有状态值都重设为有效值
cout<<"cin.clear()作用后,cin.fail() = "<<cin.fail()<<endl;
cin>>c; //由于上面清空流无效,‘ab4d4c’还在输入流中,这是读取'a'
cout<<"c = "<<c<<endl;
cin>>c; //读取'b'
cout<<"c = "<<c<<endl;
cin>>c; //读取'4'
cout<<"c = "<<c<<endl;
cin>>c; //读取'd'
cout<<"c = "<<c<<endl;



cin>>a; //读取'4'
cout<<"a = "<<a<<endl;
cout<<"cin.fail() = "<<cin.fail()<<endl;
cin.sync();
cin>>c; //想从流中读取'c' ,结果系统要我们输入新的
cout<<"clear()+sync()联合的作用后,c = "<<c<<endl;

cout<<"\n\n";

//错误状态结束
//前面的从流给a,c赋值,这里从键盘输入到流再赋值给a
cin.sync(); //这时流中fail()状态值为0,输入流被成功清空
cout<<"输入数字\n";
cin>>a;//输入成功,错误标志位为0
cout<<"a = "<<a<<endl;
return 0;

}

清除缓冲流中数据相关一系列函数的简单介绍_权值


举报

相关推荐

0 条评论