c++ std::cin用法详解
最近遇到一个bug怎么都调不出来,后来在网上查了查是cin的使用出了问题,还是对c++理解太浅了
于是来写一篇blog记录一下,方便以后查找。
cin的常用方法
std::cin位于头文件<iostream>中
cin最常见的用法便是直接用>>运算符。
1 |
|
多数人对cin的使用仅限于此,而若先输入一个字符就会发现程序后面的cin全部失效,具体的原因下面会讲。
和函数不同,cin的本质可以看成一个有重载运算符的struct,名称为istream。这也解释了诸如cin >> a >> b的这种形式,可以理解为(cin >> a) >> b,而istream与int变量使用>>进行运算返回cin本身。
cin.get()
此函数有四种形式,分别为
1 | int cin.get(); |
实例:
1 |
|
cin.getline()&getline()
cin.getline()用法类似于cin.get()的读取字符串:
1 | istream& getline(char* s, streamsize count); |
与cin.get()不同,cin.getline()不会将换行等终止字符留在缓冲区中。
而getline()在头文件<string>中,用于对string读入一整行,用法与cin.getline()类似:
1 | istream& getline(istream& is, string& str); |
类似地,也可以有getline(cin, s1) >> s2;的操作。
另外早期c语言中有gets()函数对char*输入一行,而现在被弃用,需要使用fgets(),这里不做展开。
cin的其他用法
- cin.ignore()
1 | istream& ignore(streamsize n = 1, int delim = EOF); |
- cin.peek()
1 | int peek(); |
- cin.putback()
1 | istream& putback(char c); |
cin的条件状态
在使用cin对数字输入字符时会出现错误,此时cin内部会设置条件状态,有以下四种状态:
1
2
3
4
5ios_base::goodbit//无错误
ios_base::eofbit//已到达文件尾
ios_base::failbit//非致命错误,可挽回
ios_base::badbit//致命错误,无法挽回
//通常值分别为0,1,2,4对于的成员函数如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17bool eof();
//若流中eofbit置位,则返回true
bool fail();
//若流中failbit置位,则返回true
bool bad();
//若流中badbit置位,则返回true
bool good();
//若流中goodbit置位,则返回true
void clear(istream::iostate flags = ios_base::goodbit);
//将给定的标志位flags置为1,其他位清空。默认为goodbit
int sync();
//清空缓冲区,只能在goodbit时使用。成功返回0,失败返回-1且置位badbit。
//若绑定了输出流会同时刷新输出缓冲区
void setstate(istream::iostate flags);
//将对应的条件状态位置为1
istream::iostate rdstate();
//返回当前条件状态,istream::iostare为与系统相关的整数类型一个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using namespace std;
int main()
{
//freopen("in.txt", "r", stdin);
int a;
cin >> a;
cout << cin.rdstate() << ' ' << cin.good() << endl;
cin.clear();
cout << cin.rdstate() << ' ' << cin.good() << endl;
char c;
cin >> c >> a;
cout << c << ' ' << a << endl;
return 0;
}
/*
输入:
a 1
*/
/*
输出:
4 0
0 1
a 1
*/
常见的将cin置于条件判断中,如while(cin>>a)则是判断goodbit位。
最后,在代码中必须清楚cin的原理,不能随意使用。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 MizukiCry's Blog!
评论