最近在看C++ primer plus时经常会混淆各种输入方法,例如cin,cin.get(),cin.getline(),getline()等,所以想做一个总结
输入原理
程序的输入都有一个缓冲区,当一个程序结束输入时,会将输入的数据都放到输入缓冲区,cin的函数都是从输入缓冲区取数据的,所以当输入缓冲区有残留数据时,cin会从输入缓冲区拿数据而不会请求输入
char str[10];
cin >> str;
cout << str << endl;
cin >> str;
cout << str << endl;
第一次输入时,用空格隔开两个字符串,程序就不会请求第二次输入,除非在第二次输入之前用cin.sync()函数清空输入缓冲区
char str[10];
cin >> str;
cout << str << endl;
cin.sync();
cin >> str;
cout << str << endl;
cin
cin可以读取很多变量类型,比如int,char,char *,string等,cin的输入操作在遇到(Space,Enter,Tab)时就会结束,而且读取字符串时不会将结束符读取进来
cin.get
该函数有以下几种用法
1,读取一个字符,如果该字符是有效的,该函数会返回该字符;如果该字符无效,则返回一个除字符以外的值并且设置一个错误标记(failbit)和到达文件尾标志(eofbit),failbit和eofbit属于io状态标记位,状态标记位常量有以下几个,其实这四个标志常量就是取其对应标志位的掩码,badbit为001,failbit为100,eofbit为010,goodbit为000。该用法的返回值是被读取的字符或者eof()即一个除字符以外的值
常量 | 含义 | failbit标记位的值 | eofbit标记位的值 | badbit标记位的值 | 转换成十进制 |
---|---|---|---|---|---|
failbit | IO流出现非致命错误,可以挽回 | 1 | 0 | 0 | 4 |
badbit | IO流出现致命错误,不能挽回 | 0 | 0 | 1 | 1 |
goodbit | IO完全正常 | 0 | 0 | 0 | 0 |
eofbit | 已经到达文件尾 | 0 | 1 | 0 | 2 |
char ch;
ch=cin.get();
2,读取一个字符,如果该字符是有效的,将其存储在传递过来的字符中(参数),相当于该字符的值被修改了;如果该字符无效,传递过来的字符的值不会被更改,同时设置eofbit和failbit,要注意的是这个函数不会对signed char和unsigned char进行重载,以下代码会出错。该用法的返回值是this指针
3,cin.get(str,count,结束标志),最多读取count-1个字符,将它们储存在str中,直到遇到结束标志。该方法返回一个this指针,它将会一直读取,直到遇到以下几种情况
- count-1个字符已经被储存
- 到达文件末尾,setstate(eofbit)会被调用,将标志常量设置为eofbit?
- 下一个读取的字符是结束标志,但这个结束字符不会被读取,结束标志默认为换行符
- 如果没有字符被读取,调用setstate(failbit);在任何count>0的情况下,str中都会被添加上一个空字符
cin.getline
cin.getline()会读取字符直到行末或者碰到特定的字符,该函数的返回值是this指针,cin.getline(str,count,结束标志)
它会保持读取,直到遇到以下任何一种情况,以下几种情况是按顺序进行检测的
1,到达文件末尾,同时setstate(eofbit)会被调用
2,下一个要读取的字符为结束标志,作为结束标志的字符会被读取,在gcount()中会将该字符计入读取的字符数,但是它不会被储存在str之中
3,已经读取了count-1个字符,同时会调用setstate(failbit)
如果没有字符被读取,setstate(failbit);在任何count>0的情况下,str中都会被添加上一个空字符