C++中 cin的深入理解

来源:互联网 发布:mac装office软件 编辑:程序博客网 时间:2024/06/05 12:07

C++中的cin是一个 istream对象,从标准输入中读取数据,在iostream头文件中定义。

流对象不能拷贝或赋值。此外,读写一个IO对象都会改变其状态,因此传递和返回的引用都不能是const的,否则无法读写。


条件状态:

IO流有四种条件状态,分别用位来控制。

cin.badbit :  001   1   表示系统级错误,一旦被置位,流就无法再使用了

cin.eofbit :   010    2   表示流已经读完,到达尾部了

cin.failbit:    100    4     可恢复错误,如期望读取数值却读出一个字符等错误,或者已经到达流的尾部

cin.goodbit: 000   0   可用状态


当一个流遇到数据类型不一致的错误而不可用时,我们可以使其恢复为有效状态(置换eof和fail位)

cin.clear( cin.rdstate() & ~cin.failbit & ~cin.badbit );   //cin.rdstate()表示流当前的状态

也可通过调用成员函数查看流的状态,如:cin.eof()  cin.fail() cin.bad()  cin.good()  //相应状态为真则返回true,反则为false


cin从缓冲区读取数据,有多种方式,如操作符 >>  函数getline()、get()等

1. >>

根据后面的变量的类型读取数据

读取时结束条件:enter, space, tab

对结束符的处理:丢掉

#include <iostream>using namespace std;int main(){   char str1[10], str2[10];   cin>>str1;   cin>>str2;   cout<<str1<<endl;   cout<<str2<<endl;   return 0;}
当遇到类型不一致时,流处于不可用状态,若需继续使用这个流,需恢复流的有效状态。

2. get

输入结束条件:换行符

对结束符处理:不丢掉

#include <iostream>using namespace std;int main(){  char c1, c2;   cin.get(c1);   cin.get(c2);    cout<<c1<<" "<<c2<<endl; // 打印两个字符    cout<<(int)c1<<" "<<(int)c2<<endl; // 打印这两个字符的ASCII值    return 0;}


输入a b,结果c1被赋值为a, c2被赋值为空格。即get函数只会从缓冲区中取字符,而不会过滤掉任何空格换行符等。(可自己运行只输入a和换行符的情况)

#include <iostream>int main(){    int c1, c2;    c1=cin.get();    c2=cin.get();    cout<<c1<<" "<<c2<<endl; // 打印两个字符    cout<<(int)c1<<" "<<(int)c2<<endl; // 打印这两个字符的ASCII值    cin >> c1;    cin >> c2;    cout<<c1<<" "<<c2<<endl; // 打印两个字符    cout<<(int)c1<<" "<<(int)c2<<endl;    return 0;}

测试:输入123,再输入4的结果。cin.get()只是读取字符,即使输入数字,也是char型,再转换为int型。第一次c1,c2被赋值为'1'和'2',此时缓冲区还有一个3和换行符,cin流仍然有效,再次调用cin流,给c1赋值为缓冲区的3,过滤掉换行符,再次调用cin时,缓冲区已经没有字符了,则从键盘读取,提示用户输入,输入4赋值给c2.此时的c1和c2直接是int型的。

123       
49 50
49 50
4
3 4
3 4


3.getline()

getline读取一行,以换行符结束,丢掉换行符。还可指定读取多少个字符到数组,读取完后剩余的字符放在流中,流被置为无效状态,可以通过置换使他们变有效,然后继续读取,见例子。

#include <iostream>int main(){    char str[10];    cin.getline(str,5);    cout << str << endl;    cout << "read state: " << cin.rdstate() << endl;    cin.clear(cin.rdstate() & ~cin.failbit);    cout << "read state: " << cin.rdstate() << endl;    cin.getline(str,5);    cout << str << endl;    return 0;}



4.cin之后使用getline会出现空行,调用cin.ignore()即可

#include <iostream>#include <string>using namespace std;int main(){int n;cin >> n;cin.ignore(); //如果注释掉string c;getline(cin, c);cout << c << endl;        return 0;}

如果注释掉cin.ignore(),输入2\enter,输出空行。

        不注释,输入2\enterA,输出A。

因为cin有时会以\n作为结束标志,但它还在缓存区中,而getline以\n为结束标志,会读取上一次输入得到的\n,得到一个空行。

cin.ignore(1000, '\n')的含义是把缓冲区内从当前字符开始知道'\n'之前字符(如果有1000个的话)忽略掉,实际上你这里假设一行不会超过1000个字符,所以含义是忽略一行


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 双人骑自行车车坐压往后仰了怎么办 穿高帮钉鞋踢人造草出现水泡怎么办 耐克大吕布鞋面上的标志起来怎么办 国三柴油车环保查尾气超标怎么办 手上被玻璃手上扎进玻璃丝怎么办 月子腰疼怎么办能养过来吗 躺太久屁股长一粒一粒的痒怎么办啊 乳腺癌两年后手臂疼胳膊肿怎么办 胳膊疼就和抻筋是的怎么办 四岁胳膊扭了肿了怎么办 干燥综合症使皮肤变黑色了怎么办 刚生的小孩脖子上有淋巴结怎么办 地包天矫正期间嘴歪了怎么办 5个月的宝宝歪胫怎么办 三个多月的宝宝有点斜颈怎么办 5月宝宝有点斜颈偏向左侧怎么办 外斜术后变周期性内斜怎么办 右腰劳损休息一个多月还痛怎么办 宝宝鼻子不通气用嘴呼吸怎么办 窦性心律过速怎么办st-t改变 跑步机跑带上撒油跑起来滑怎么办 娃儿上嘴唇里面破了怎么办图片 支付宝添加好友点忽略了怎么办 如果综合评价考了两间大学怎么办 国二报名时民族错了怎么办 屁股凹陷下去一块已经萎缩了怎么办 我家孩子上高中了英语不好怎么办 驼背脖子向前倾怎么办用背背佳 屁股大又肥是骨盆前倾怎么办 手术40多天引起小腿变细了怎么办 老师教育学生学生跑出教室你怎么办 有矛盾舍友发朋友圈攻击我怎么办 飞机杯送的润滑油很快用完了怎么办 人笨记性不好内向反应迟钝该怎么办 洗衣机滋生了大量的霉菌在怎么办? 爸妈给兄弟买的房子贵很多怎么办 输了十几万 不敢跟爸妈讲怎么办 赌博欠2万不敢和爸妈讲怎么办 学校凳子坏了丢了 现在要查怎么办 我想写字可就是写的不好看怎么办 我的字写的很丑怎么办