zoukankan      html  css  js  c++  java
  • STL中流相关的输入输出符和get函数彻底总结:cin、cin.get()、cin.getline()、getline()、gets()等函数的用法

    我的总结:

    【首先:对于流来说,就把流看成一个中转的仓库,对流进行<<运算或>>运算或者get函数的运算都是指,把“流”中的数据“运送”到“内存变量”中去,还是把内存变量中的数据“拷贝”到流中去。注意这里“运送”和“拷贝”的区别,我专门用“运送”这个动作来表示每次运算完后流的定位符都会发生变化。】

    【第二,对于输入输出是以内存变量为中心判断的,如果是从内存变量中取数据则为输出用<<;如果写入数据到内存变量则为输入用>>运算符。所以对于内存变量来说,cin是衣食父母,最为亲切,他总是养着我们,衣来张手饭来张口;而cout则是敌人,总是抢我们的东西。】

    【第三,对于标准输入输出流cin和cout来说,他们两个无时无刻不在自动和标准的键盘和屏幕设备自动关联的。所以,每次对cin做运算(包括<<、>>或get或write),首先从流中去一定的数据到内存变量,一旦发现流中空了,则对cin做的运算就会处于阻塞状态,任何时候从键盘输入数据都会自动存入到cin中,此时cin中又有数据了,对cin的运算就会被激活而继续执行。】

    【第四,目前所有的流只要前面不加w则这些流内部的数据都是用char对于的二进制码也即ascii码进行存储在流中的;当然也有wostream、wistream、wcin等对象,这些加w的流内部是以宽字符进行存储。】

    【第五,<<和>>运算符所表示的整个表达式返回的结果是cin或cout对象。】

    【第六,状态标记位,只需要记住常用的四个判断函数即可。good()表示一切正常则返回真;eof()表示到达流的末尾则返回真(我经过测试发现只针对文件的结尾有效);fali()表示i/o操作失败比如把char数据赋予了int数据则返回真,但流没有被破坏,流内部的数据是完好的;bad()表示发生了严重的物理错误,流被破坏,即流内部的数据可能被破坏了,流不能再继续使用了。如果后三个函数都为false,good()操作才返回真。】

    【第七,一个典型的例子,如下:】

    #include <iostream>

    using namespace std;
    int main()
    {
        int a;
        cout<<"请输入a的值:";
        while(1)
        {
            cin>>a;
            if(cin.fail()) //如果cin里面都是字符则一直执行这个if块
            {
                cout<<"给变量a的数据,类型不对!"<<endl;
                cin.clear();
                cout<<"从cin中清空(取出)一个字符:"<<cin.get()<<",然后定位符后移一位。"<<endl;

                if(cin.good()) //测试clear后的状态,get()函数也一直没有改变cin的状态
                      cout<<"当前状态:good!"<<endl<<endl;
            }
            else //如果cin里面有数字,才执行这个else块
            {
                cout<<"终于找到了数字,a= "<<a<<endl<<endl;
                //break;  //这个break注释掉后while就永远退不出来了
            }
        }//end-while

        //下面内容用于暂停功能
        cout<<"已经暂停,按任意键退出!";
        char s; cin>>s;

        return 0;
    }

    运行结果如下:

    分析:cin.clear()函数作用是清楚流的状态位,让条件都重设为有效状态。cin.get()函数从流中读一个字符(char)并返回这个字符的asci码(即返回值是int型)。

    实际上上面的代码运行起来后一直处于while中,不断的一位一位的情况流中的数据,然后再接受新的数据到流中,再重复一位一位的清空数据。

    从这个例子要学习到:流cin读到结尾,即“定位符”移到流的结尾后,再执行cin>>运算则处于阻塞状态。可以认为是每次定位符后移一位前面的数据都清空了(实际情况可能不是这样),所以可以认为定位符移到末尾时认为流是空的,所以再从流中读数据会阻塞

    以下内容转自(参考):http://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html

    学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行)

    1、cin 
    2、cin.get() 
    3、cin.getline() 
    4、getline() 
    5、gets() 
    6、getchar()

    附:cin.ignore();cin.get()//跳过一个字符,例如不想要的回车,空格等字符

    1、cin>>         

    用法1:最基本,也是最常用的用法,输入一个数字:

    #include <iostream> 
    using namespace std; 
    main () 

    int a,b; 
    cin>>a>>b; 
    cout<<a+b<<endl; 
    }

    输入:2[回车]3[回车] 
    输出:5

    注意:>> 是会过滤掉不可见字符(如 空格 回车,TAB 等) 
    cin>>noskipws>>input[j];//不想略过空白字符,那就使用 noskipws 流控制

    【从底层理解:cin是个已经存在的全局对象,每次遇到“cin>>”这个操作时就表示要从cin关联的那块缓存中取一块数据,如果发现cin关联的那块缓存是空的则中断等待输入数据,一旦我们从键盘输入了数据后就自动进入cin对象关联的那块缓存,因为cin是和标志输入设备“键盘”绑定在一起的。此时恢复中断处继续执行,就把输入的字符串写入到变量中了。】

    用法2:接受一个字符串,遇“空格”、“TAB”、“回车”都结束

    #include <iostream> 
    using namespace std; 
    main () 

    char a[20]; 
    cin>>a; 
    cout<<a<<endl; 
    }

    输入:jkljkljkl 
    输出:jkljkljkl

    输入:jkljkl jkljkl       //遇空格结束 
    输出:jkljkl

    2、cin.get()

    用法1: cin.get(字符变量名)可以用来接收字符

    #include <iostream> 
    using namespace std; 
    main () 

    char ch; 
    ch=cin.get();               //或者cin.get(ch); 
    cout<<ch<<endl; 
    }

    输入:jljkljkl 
    输出:j

    用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格

    #include <iostream> 
    using namespace std; 
    main () 

    char a[20]; 
    cin.get(a,20); 
    cout<<a<<endl; 
    }

    输入:jkl jkl jkl 
    输出:jkl jkl jkl

    输入:abcdeabcdeabcdeabcdeabcde (输入25个字符) 
    输出:abcdeabcdeabcdeabcd              (接收19个字符+1个'')

    用法3:cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数目)的不足.

    这个我还不知道怎么用,知道的前辈请赐教;

    3、cin.getline()   // 接受一个字符串,可以接收空格并输出

    #include <iostream> 
    using namespace std; 
    main () 

    char m[20]; 
    cin.getline(m,5); 
    cout<<m<<endl; 
    }

    输入:jkljkljkl 
    输出:jklj

    接受5个字符到m中,其中最后一个为'',所以只看到4个字符输出;

    如果把5改成20: 
    输入:jkljkljkl 
    输出:jkljkljkl

    输入:jklf fjlsjf fjsdklf 
    输出:jklf fjlsjf fjsdklf

    //延伸: 
    //cin.getline()实际上有三个参数,cin.getline(接受字符串的看哦那间m,接受个数5,结束字符) 
    //当第三个参数省略时,系统默认为'' 
    //如果将例子中cin.getline()改为cin.getline(m,5,'a');当输入jlkjkljkl时输出jklj,输入jkaljkljkl时,输出jk

    当用在多维数组中的时候,也可以用cin.getline(m[i],20)之类的用法:

    #include<iostream> 
    #include<string> 
    using namespace std;

    main () 

    char m[3][20]; 
    for(int i=0;i<3;i++) 

    cout<<" 请输入第"<<i+1<<"个字符串:"<<endl; 
    cin.getline(m[i],20); 
    }

    cout<<endl; 
    for(int j=0;j<3;j++) 
    cout<<"输出m["<<j<<"]的值:"<<m[j]<<endl;

    }

    请输入第1个字符串: 
    kskr1

    请输入第2个字符串: 
    kskr2

    请输入第3个字符串: 
    kskr3

    输出m[0]的值:kskr1 
    输出m[1]的值:kskr2 
    输出m[2]的值:kskr3

    4、getline()     // 接受一个字符串,可以接收空格并输出,需包含“#include<string>”

    #include<iostream> 
    #include<string> 
    using namespace std; 
    main () 

    string str; 
    getline(cin,str); 
    cout<<str<<endl; 
    }

    输入:jkljkljkl 
    输出:jkljkljkl

    输入:jkl jfksldfj jklsjfl 
    输出:jkl jfksldfj jklsjfl

    和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数

  • 相关阅读:
    Eclipse安装Hadoop插件
    (转)Ubuntu14.0.4中hadoop2.4.0伪分布模式配置
    Hadoop--DataNode无法启动
    启动与关闭hadoop
    hadoop中执行命令时发生错误
    strings命令
    Deriving data from ElasticSearch Engine
    elasticsearch data importing
    reading words in your computer and changing to female voice, linux festival text2wave saving wav files
    DDNS client on a Linux machine
  • 原文地址:https://www.cnblogs.com/hnfxs/p/3149383.html
Copyright © 2011-2022 走看看