cin作为判断条件时(关于cin的理解)
关于cin
cin是istream类的对象,它是从标准输⼊设备(键盘)获取数据,(此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这⾥的标准输出和标准错误输出指的是终端的屏幕) 程序中的变量通过流提取符">>"从流中提取数据。流提取符">>"从流中提取数据时跳过输⼊流中的空格、tab键、换⾏符等空⽩字符。注意:只有在输⼊完数据再按回车键后,该⾏数据才被送⼊键盘缓存区,形成输⼊流,提取运算符">>"才能从中提取数据。需要注意保证从流中读取数据能正常运⾏。
例如:
int a,b;
cin>>a>>b;     
若从键盘中输⼊21 abc回车,变量a从输⼊流中提取整数21,提取操作成功,此时cin流出于正常状态。但在变量b准备提取⼀个整数时,遇到了字母a,显然提取操作失败了,此时,cin流被置为出错状态。只有在正常状态,才能从输⼊流中提取数据。
字符输⼊的流成员函数
  除了可以⽤cin输⼊标准类型的数据外,还可以⽤istream类流对象的⼀些成员函数,实现字符的输⼊。如(),line(字符数组(或字符指针),字符个数n,终⽌标志字符)
eof函数
  eof是end of file 的缩写,表⽰“⽂件结束”。从输⼊流读取数据,如果到达⽂件末尾(遇到⽂件结束符),eof函数值为⾮零值(表⽰真),否则为0(表⽰假)。
peek函数
  peek是观察的意思,peek函数的作⽤是观测下⼀个字符。  调⽤形式为c=cin.peek();
putback函数
  调⽤形式为cin.putback(ch)   其作⽤是将前⾯⽤get或者getline函数从输⼊流中读取的字符ch返回到输⼊流,插⼊到当前指针的位置,供后⾯读取。
ignore函数
  调⽤形式为cin.ignore(n,终⽌字符)   函数作⽤是跳过输⼊流中n个字符,或在遇到指定的终⽌字符时提前结束(此时跳过包括终⽌字符在内的若⼲字符)。
cin的状态标⽰符:
常量含义failbit标记位的值eofbit标记位的值badbit标记位的值转化为10进制ios::failbit输⼊(输出)流出现⾮致命错误,可挽回1004 ios::badbit输⼊(输出)流出现致命错误,不可挽回0012 ios::eofbit已经到达⽂件尾0101 ios::goodbit流状态完全正常0000
分别对应cin.fail(),cin.bad(),f(),d()
cin.rdstate()对应⼗进制。
while(cin>>n)
最近在看C++,学到了标准库这⼀章,看到cin的时候,我们经常看到很多的代码中会有这么⼀段while(cin>>x){ ......}。这⾥我们最关注的问题是while括号⾥⾯cin>>x他每次输⼊的时候返回的是什么值呢。所以我们也就会问cin的返回值是什么。我也看到很多像我这样的新⼿问这样的问题,下⾯说下我个⼈的见解,如有不当之处,还请指正!
其实我倒觉得我们这个问题问错了,我们不应该问cin返回值是什么,我觉得我们应该关注">>"输⼊操作符,其实是它到底返回了什么。因为cin是标准输⼊istream的⼀个对象,⼀个对象能返回什么吗?对象有返回值吗?好像没有吧!在C++primer⾥⾯讲到过,cin>>x>>y。有这么⼀⾏代码,我们讨论下">>"这
个输⼊操作符,这个操作符接收⼀个istream对象作为其做操作数,接收⼀个对象作为其右操作数。">>"操作符返回其左操作数作为结果,这样也就可以解释为什么上⾯可以将两个输⼊操作合并了。因为cin>>x返回cin对象,接着⼜可以进⾏cin>>y。所以我们就可以顺利进⾏输⼊了。所以我们再来看上⾯的那个while循环,⾥⾯的cin>>x,返回的是cin对象(注意是输⼊操作符“>>”返回),所以返回的也就可以认为是流本⾝了。我们再来看下他什么时候退出循环。因为我们已经知道了括号⾥⾯的返回值了,所以我们看看它什么时候退出循环。
输⼊(cin)缓冲是⾏缓冲。当从键盘上输⼊⼀串字符并按回车后,这些字符会⾸先被送到输⼊缓冲区中存储。每当按下回车键后,cin 就会检测输⼊缓冲区中是否有了可读的数据,这种情况下cin对键盘上是否有作为流结束标志CTRL+Z或者CTRL+D,其检查的⽅式有两种:阻塞式以及⾮阻塞式。这⾥借⽤⼀点⽹上搜到的资料,
阻塞式检查⽅式指的是只有在回车键按下之后才对此前是否有 Ctrl+Z 组合键按下进⾏检查,⾮阻塞式样指的是按下 Ctrl+D 之后⽴即响应的⽅式。如果在按 Ctrl+D 之前已经从键盘输⼊了字符,则 Ctrl+D的作⽤就相当于回车,即把这些字符送到输⼊缓冲区供读取使⽤,此时Ctrl+D不再起流结束符的作⽤。如果按 Ctrl+D 之前没有任何键盘输⼊,则 Ctrl+D 就是流结束的信号。
阻塞式的⽅式有⼀个特点:只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下。还有⼀个特点,
  Windows下是不⽤CTRL+D 的,如果在你的程序中使⽤CTRL+D的话,如果你还有要输⼊的数据的话,会直接挂掉的,不能再输⼊了。Windows下是使⽤CTRL+Z的。在你输⼊CTRL+Z后,括号⾥⾯的数据变为0了。来看⼀段程序:(vc6.0上运⾏)
#include <iostream>
using namespace std;
int main(void)
{
int  i;
cout<<(cin>>i)<<endl;
return0;
}
  当你按下CTRL+Z后,按下两次回车,就可以得到结果0.所以上⾯的while会退出循环。但是当你在你
的程序中输⼊数据的时候,你要结束输⼊,你输完数据直接回车,再按下CTRL+Z,再按下回车就可以结束了。因为前⾯说过如果输⼊缓冲区中有可读的数据则不会检测Ctrl+Z(因为有要读的数据,还不能认为到了流的末尾)。还有⼀点需要知道,Ctrl+Z产⽣的不是⼀个普通的ASCII码值,也就是说它产⽣的不是⼀个字符,所以不会跟其它从键盘上输⼊的字符⼀样能够存放在输⼊缓冲区。!
 在理解cin功能时,不得不提标准输⼊缓冲区。当我们从键盘输⼊字符串的时候需要敲⼀下回车键才能够将这个字符串送⼊到缓冲区中,那么敲⼊的这个回车键(\r)会被转换为⼀个换⾏符\n,这个换⾏符\n也会被存储在cin的缓冲区中并且被当成⼀个字符来计算!⽐如我们在键盘上敲下了123456这个字符串,然后敲⼀下回车键(\r)将这个字符串送⼊了缓冲区中,那么此时缓冲区中的字节个数是7 ,⽽不是6。
cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,⼀旦缓冲区中有数据,就触发cin的成员函数去读取数据。当cin>>从缓冲区中读取数据时,若缓冲区中第⼀个字符是空格、tab或换⾏这些分隔符时,cin>>会将其忽略并清除,继续读取下⼀个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后⾯的分隔符是残留在缓冲区的,cin>>不做处理。
使⽤⼀个istream的对象作为条件时,效果是检查流的状态。若流有效,则检测成功,返回true。当遇到⽂件结束符或者⽆效的输⼊(⽐如⽤⼀个字符来作为⼀个整型数的输⼊时),istream的对象状态会变为⽆效。
字符串常量是字符常量吗总结:cin是⼀个istream的对象,判断时会检查流的状态,流有效返回ture,当⽂件结束符或者⽆效的输⼊(⽐如⽤⼀个字符来作为⼀个整型数的输⼊时)时,返回false。
注:windows环境下ctrl+z 结束输⼊
ctrl+c直接结束数据(数据不会进去缓存区)
个⼈理解,有错误还望指出。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。