cin 读取从非空白字符开始,到与目标类型不匹配的第一个字符之间的全部内容。
int n; int sum = 0; while (cin >> n) { sum += n; } cout << "最后输入n的值为: " << n <<
"\n"; cout << "sum的值为: " << sum << "\n";
输入了“i”与预期格式不匹配的字符,所以cin >> n结果为false,循环终止

<>流状态

成员 描述
eofbit 如果到达文件尾,则设置1
badbit 如果流被破坏,则设置为1,例如,文件读取错误
failbit 如果输入操作未能读取预期的字符或输出操作没有写入预期的字符,则设置为1
eof() 如果eofbit被设置,则返回true
bad() 如果badbit被设置,则返回true
fail() 如果badbit或failbit被设置,则返回true
clear()方法,将清除3个状态(eofbit, badbit, failbit),设置为0

为什么要重置流状态呢?
在输入不匹配或者到达文件尾时,需要使用不带参数的clear()重新打开输入。
int n; cout << "输入n = "; cin >> n; cout << "n的值为: " << n << "\n"; double d;
cout<< "输入d = "; cin >> d; cout << "d的值为: " << d << "\n";
第一次输入n时,输入了错误的内容,流状态failbit设置为1,直接影响了第二次的cin输入

加入了clear()的修改
cout << "fail() = " << cin.fail() << "\n"; int n; cout << "输入n = "; cin >> n;
cout<< "n的值为: " << n << "\n"; cout << "fail() = " << cin.fail() << "\n"; cin.
clear(); cout << "===================使用cin.clear()后====================" << "\n"
; cout << "fail() = " << cin.fail() << "\n"; double d; cout << "输入d = "; cin >>
d; cout << "d的值为: " << d << "\n"; cout << "fail() = " << cin.fail() << "\n";
已经清除流状态了,为什么d还是不让输入,数值还是不确定的?


这是我们第一次输入的值没有被读取,它还在输入队列中,等待被取出,到了d的输入时,直接不需我们输入,就读取到了输入队列的值,但是它是不满足d的类型,所以打印是不确定的值。

应用清除输入队列后:
cout << "fail() = " << cin.fail() << "\n"; int n; cout << "输入n = "; cin >> n;
cout<< "n的值为: " << n << "\n"; cout << "fail() = " << cin.fail() << "\n"; cin.
clear(); cout << "===================使用cin.clear()后====================" << "\n"
; while (cin.get() != '\n') { continue; } cout <<
"===================使用清除输入队列后=====================" << "\n"; cout << "fail() = "
<< cin.fail() << "\n"; double d; cout << "输入d = "; cin >> d; cout << "d的值为: " <<
d<< "\n"; cout << "fail() = " << cin.fail() << "\n";
while (cin.get() != ‘\n’)
{
continue;
}
get原型,int get(); 读取缓冲区的单个字符,并返回其int类型
可以将上面的代码理解成,清除缓冲区的一整行内容。

也可以使用:
while (!isspace(cin.get()))
continue;
原型:int isspace ( int c ); //判断是否是空白字符,是则返回非0值,否则返回0
和上一个方法的不同是,这个清除缓冲区是只能清除一个单词。

<>get和getline的使用

get原型:
int get();//获取输入队列的一个字符
istream& get (char& c);//获取输入队列的一个字符赋值给c
istream& get (char* s, streamsize n);
第一个参数是要输入字符指针的地址,第二个参数字符指针存储字符的个数(字符结尾要加’\0’),字符个数也要加1
istream& get (char* s, streamsize n, char delim);
前两个参数和上面一样,第三个参数是分界符,前两个参数的版本默认是’\n’作为分界符。

当上述函数,读取到最大字符个数或遇到分界符,则停止
char name[30]; cout << "输入name:"; cin.get(name, 30, '#');//分界符# cout << name <<
"\n"; cout << "查看输入队列的内容:" << (char)cin.get() << "\n";

char name[30]; cout << "输入name:"; cin.getline(name, 30, '#');//分界符# cout <<
name<< "\n"; cout << "查看输入队列的内容:" << (char)cin.get();

上述两个例子说明get和getline的区别
get将分界符留在输入队列中,getline则将其丢弃。

ignore() 清除输入队列的内容
char c1; char c2; cout << "输入两个单词:"; c1 = cin.get(); cin.ignore(255, ' ');
//清除输入队列内容,读取255个字符或遇到空格停止清除 c2 = cin.get(); cout << "两个单词首字母:" << c1 << " " <<
c2<< "\n";

输入行为

方法 行为
getline(char*,int) 如果没有读取任何字符(不包括换行符),设置为failbit
如果读取了最大数目的字符,且行中还有其他字符,则设置为failbit
get(char*,int) 如果没有读取任何字符,则设置failbit

peek() 函数返回输入中的下一个字符,但不抽取输入流中字符。
cin.peek();

gcount()
函数返回最后一个非格式化方法读取(不是>>运算符读取)的字符数。类似于strlen()只不过,此方法是冲输入流中读取字符记录个数,比strlen()速度慢很多。
cin.gcount();

putback() 函数将一个字符插入到输入字符串中,插入的是下一条输入语句的第一个字符。
参数是字符类型
cin.putback(ch);

当输入字符数组时,超出字符数组大小后,将最后的一个字符设置为\0
char title[20]; char name[10]; cout << "name:"; cin.get(name, 10); if (cin.peek
() != '\n') { cout << "超过9个字符大小\n"; } cout <<"name =" << name << "\n";
//超出范围,它将最后的一个字符设置为\0 cout << "title:"; cin.get(title, 20); cout << "title =" <<
title<< "\n";

eof()
原型
bool eof() const;
判断是否到达文件尾,检查eofbit是否被设置,eofbit=1则返回真,否则返回假

技术
©2019-2020 Toolsou All rights reserved,
JAVA 把字符串转换成数字类型函数基本定义和使用‘未完待续hive压缩&&hdfs合并小文件数字滚动抽奖小程序什么是内存泄漏,常见引起引起内存泄漏的原因,及解决办法华为Mate 40 Pro+ 5G曝光:徕卡电影镜头、陶瓷机身判断当前对象是不是数组的4种方式Vue页面跳转传递参数及接收Dialog 中 使用 EventBus 问题Spring Boot教程十六:SpringBoot注入类实现多线程