cin做为判断条件时(关于cin的理解)

关于cin

cin是istream类的对象,它是从标准输入设备(键盘)获取数据,(此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出和标准错误输出指的是终端的屏幕) 程序中的变量经过流提取符">>"从流中提取数据。流提取符">>"从流中提取数据时跳过输入流中的空格、tab键、换行符等空白字符。注意:只有在输入完数据再按回车键后,该行数据才被送入键盘缓存区,造成输入流,提取运算符">>"才能从中提取数据。须要注意保证从流中读取数据能正常运行。
   ios

例如: int a,b; cin>>a>>b;     

若从键盘中输入21 abc回车,变量a从输入流中提取整数21,提取操做成功,此时cin流出于正常状态。但在变量b准备提取一个整数时,遇到了字母a,显然提取操做失败了,此时,cin流被置为出错状态。只有在正常状态,才能从输入流中提取数据。windows

字符输入的流成员函数
  除了能够用cin输入标准类型的数据外,还能够用istream类流对象的一些成员函数,实现字符的输入。如cin.get(),cin.getline(字符数组(或字符指针),字符个数n,终止标志字符)数组

eof函数
  eof是end of file 的缩写,表示“文件结束”。从输入流读取数据,若是到达文件末尾(遇到文件结束符),eof函数值为非零值(表示真),不然为0(表示假)。缓存

peek函数
  peek是观察的意思,peek函数的做用是观测下一个字符。   调用形式为c=cin.peek();函数

putback函数
  调用形式为cin.putback(ch)   其做用是将前面用get或者getline函数从输入流中读取的字符ch返回到输入流,插入到当前指针的位置,供后面读取。spa

ignore函数
  调用形式为cin.ignore(n,终止字符)   函数做用是跳过输入流中n个字符,或在遇到指定的终止字符时提早结束(此时跳过包括终止字符在内的若干字符)。指针

 

cin的状态标示符:code

常量对象

含义blog

failbit标记位的值

eofbit标记位的值

badbit标记位的值

转化为10进制

ios::failbit

输入(输出)流出现非致命错误,可挽回

1

0

0

4

ios::badbit

输入(输出)流出现致命错误,不可挽回

0

0

1

2

ios::eofbit

已经到达文件尾

0

1

0

1

ios::goodbit

流状态彻底正常

0

0

0

0

分别对应cin.fail(),cin.bad(),cin.eof(),cin.good()

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; return  0; }

   当你按下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直接结束数据(数据不会进去缓存区)

 

 我的理解,有错误还望指出。

相关文章
相关标签/搜索