• 8.5 C++输入相关的成员函数


    参考:http://www.weixueyuan.net/view/6411.html

    总结:

      输入相关的常用的类成员函数。

      1) get函数有三种重载形式:不带参数、带一个参数和带有三个参数。

        不带参数的get函数,其功能是从输入流中读入一个字符,并将其返回,但遇到文件结束符时则返回文件结束标识EOF,文件结束符标识是采用宏定义的形式定义出来的,它的宏定义形式如下:
            #define EOF (-1)

        文件结束符在不同的编译器上定义不同,在Visual studio环境下运行程序,Ctrl + z 即为EOF。

        get函数在遇到空格、tab键以及换行符并不会像cin那样直接进行忽略,而是将它们当成一个字符。

        带有一个参数的get函数,其参数是一个char型变量,用于存放读入的单个字符。同时函数的返回值不再是读入的字符,而是bool类型,读取成功时函数返回一个非0值,当读取失败则返回0,相当于false,此时则停止读入字符。

        带有三个参数的get函数:第一个参数是字符数组或字符指针,用于将读入的字符串存入到字符数组或指针所指向的内存空间;第二个参数为读入字符个数;最后一个参数为读取的终止字符。如果未读满指定的个数就碰到了终止字符,则会提前终止读入字符。函数读取成功返回一个非0值,读入失败或遇到文件终止符则返回0,即为false。  

         调用get函数时第二个参数设置为10,但是每次读入的字符只有9个,这是因为字符数组末尾的一个字符为’’。

      2)getline函数和带三个参数的get函数类似,getline函数的三个参数与get函数的三个参数含义是相同的。

      getline与带三个参数的get函数的区别:
        getline读取输入的字符,其终止字符是不被读入的,碰到一个终止字符则终止本次读入操作,然后指针向后移动一位,指向终止字符的后一个字符,下次读入则从终止字符后面的一个字符读入。

        而带三个参数的get函数碰到终止字符则停止读入,指针并不会向后移一位指向终止字符后面一个字符,下次读入的时候仍是从终止字符开始读取,如果这一次读取的终止字符与上一次读入时的终止字符相同,则本次读入将不能读到字符。

          即cin.get()函数的第三个参数在第二次读入的时候仍不变,则会马上终止,因为读取的第一个字符就是终止字符,就马上结束此次读取操作。

      eof函数可以用于判断读入数据是否遇到文件结束符,如果遇到文件结束符则返回true,否则返回false。eof其实是end of file的缩写。  

      ignore( int n, char )函数用于忽略输入的n个字符或在遇到指定的字符时提前终止忽略行为。ignore函数的两个参数都带有默认值,n的默认值为1,第二个参数char默认值为EOF。

      peek函数没有参数,它用于返回当前指针所指的字符,并且不会移动指针。如果当前指针所指向的是文件结束符,则该函数返回-1(EOF)。

      putback ( char )函数是将get或getline函数读取到的字符重新插入到缓冲区当前指针所指位置,后面仍然会读取该字符。  

     --------------------------

    本节我们介绍一下输入相关的常用的类成员函数。

    1) get函数

    get函数有三种重载形式:不带参数、带一个参数和带有三个参数。首先我们来看一下不带参数的get函数的使用方法。
    不带参数的get函数,其功能是从输入流中读入一个字符,并将其返回,但遇到文件结束符时则返回文件结束标识EOF,文件结束符标识是采用宏定义的形式定义出来的,它的宏定义形式如下:
        #define EOF (-1)

    例1:
    #include <iostream>
    using namespace std;
    
    int main()
    {
        char a;
        while ( (a = cin.get()) != EOF )
        {
            cout.put(a);   
        }       
        cout << endl;
        return 0;
    }

    本例程调用get函数,每次从输入流中读入一个字符,然后将其输出。如此循环直到遇到文件结束符。运行程序:(↙表示用户按下enter键)

    Abcdefghi 12340_+<.>?↙
    Abcdefghi 12340_+<.>?↙
    Asdf sss00.kkksk↙
    Asdf sss00.kkksk↙
    Ctrl + z

    get函数在遇到空格、tab键以及换行符并不会像cin那样直接进行忽略,而是将它们当成一个字符。在运行时当用户按下enter键之后就会将先前的输入字符全都输出,但这并不意味着enter键就是文件结束符,enter键不是文件结束符。程序运行之所以会发生这样的情况,那是因为enter键会带动一次清扫缓冲区行为。每当用户输入一行字符串按下enter键之后,清扫一次缓冲区,将先前输入内容从缓冲区中读出。文件结束符在不同的编译器上定义不同,在Visual studio环境下运行程序,Ctrl + z 即为EOF。在这个例程中put函数的功能是输出一个字符,也是一个成员函数,可以通过cout对象进行调用。

    带有一个参数的get函数,其参数是一个char型变量,用于存放读入的单个字符。同时函数的返回值不再是读入的字符,而是bool类型,读取成功时函数返回一个非0值,当读取失败则返回0,相当于false,此时则停止读入字符。

    例2:
    #include <iostream>
    using namespace std;
    
    int main()
    {
        char a;
        while ( cin.get(a) )
        {
            cout.put(a);   
        }       
        cout << endl;
        return 0;
    }
    运行程序
    Abcdefghi 12340_+<.>?↙
    Abcdefghi 12340_+<.>?↙
    Asdf sss00.kkksk↙
    Asdf sss00.kkksk↙
    Ctrl + z

    带有三个参数的get函数:第一个参数是字符数组或字符指针,用于将读入的字符串存入到字符数组或指针所指向的内存空间;第二个参数为读入字符个数;最后一个参数为读取的终止字符。如果未读满指定的个数就碰到了终止字符,则会提前终止读入字符。函数读取成功返回一个非0值,读入失败或遇到文件终止符则返回0,即为false。

    例3:
    #include <iostream>
    using namespace std;
    
    int main()
    {
        char a[10];
        while ( cin.get( a, 10, '
    ' ) )
        {
            cout << a << endl;
        }       
        cout << endl;
        return 0;
    }
    运行程序:
    01234567890123456789↙
    012345678
    901234567
    89

    本例中使用get函数依次读入输入字符,我们在调用get函数时第二个参数设置为10,但是每次读入的字符只有9个,这是因为字符数组末尾的一个字符为’’,因此每次给出的参数是n,但每次仅读取n-1个字符。get函数的这种重载方式第三个参数可以省略,默认为’ ’。

    在系统类库中get函数并非只有这三种类库,不过这三种使用的频繁一些,如果需要了解其它的重载形式可以参考C++类库手册。

    2) getline函数

    getline函数和带三个参数的get函数类似,getline函数的三个参数与get函数的三个参数含义是相同的,在此就不多做介绍了。我们直接来看下示例。

    例4:
    #include <iostream>
    using namespace std;
    
    int main()
    {
        char a[10];
        cin.getline( a, 10, '7' );
        cout << a << endl;
        cin.getline( a, 10, '7' );
        cout << a << endl;
        cin.getline( a, 10 );
        cout << a << endl;
        return 0;
    }
    运行程序:
    12345678901234567890↙
    123456
    890123456
    890

    当我们输入“12345678901234567890”时,第一次读取,还没读取到9个字符就已经碰到字符‘7’了,此时终止读入,输出a数组中的内容“123456”。然后第二次读入从‘8’开始,刚好读满9个字符,终止读入,输出a数组内容“890123456”,第三次读入从‘8’开始,getline的第三个参数默认是‘ ’,因此将剩余的字符读入之后将其输出。

    getline与带三个参数的get函数的区别:
    在本例中我们可以看到getline读取输入的字符,其终止字符是不被读入的,碰到一个终止字符则终止本次读入操作,然后指针向后移动一位,指向终止字符的后一个字符,下次读入则从终止字符后面的一个字符读入。而带三个参数的get函数碰到终止字符则停止读入,指针并不会向后移一位指向终止字符后面一个字符,下次读入的时候仍是从终止字符开始读取,如果这一次读取的终止字符与上一次读入时的终止字符相同,则本次读入将不能读到字符。这就是getline函数和带三个参数的get函数的差别。

    3) eof函数

    eof函数可以用于判断读入数据是否遇到文件结束符,如果遇到文件结束符则返回true,否则返回false。eof其实是end of file的缩写。

    例5:
    #include <iostream>
    using namespace std;
    
    int main()
    {
        char a;
        while( ! cin.eof() )
        {
            cin.get(a);
            cout.put(a);   
        }
        return 0;
    }
    本程序很简单,在while循环每次都判断是否读入到文件结束符,如果读入文件结束符则跳出循环。

    4) ignore函数

    ignore( int n, char )函数用于忽略输入的n个字符或在遇到指定的字符时提前终止忽略行为。ignore函数的两个参数都带有默认值,n的默认值为1,第二个参数char默认值为EOF。

    例6:
    #include <iostream>
    using namespace std;
    
    int main()
    {
        char a[10];
        cin.get( a, 10, '7' );
        cout << a << endl;
        cin.ignore();
        cin.get( a, 10, '7' );
        cout << a << endl;
        cin.get( a, 10 );
        cout << a << endl;
        return 0;
    }

    在前面我们提到过get函数在第一次和第二次读入字符的时候,不会主动跳过终止字符,此时如果第一次和第二次读入的终止字符相同,用get函数第二次读入则无法读入到字符,因为一开始就碰到终止字符,就终止读入了,为此我们可以使用ignore函数,将这个终止字符忽略掉。忽略了终止字符后,第二次读入就不会有问题了。运行该例程:

    12345678901234567890↙
    123456
    890123456
    7890

    因为我们使用了ignore函数忽略了终止字符‘7’,故而第二次依然用‘7’作为终止字符仍然可以读取到字符,第二次读取字符完成后,并没有使用ignore函数,并且第三次读入的终止字符为‘ ’,因此第三次读入的字符是从‘7’开始的。

    5) peek函数

    peek函数没有参数,它用于返回当前指针所指的字符,并且不会移动指针。如果当前指针所指向的是文件结束符,则该函数返回-1(EOF)。

    6) putback函数

    putback ( char )函数是将get或getline函数读取到的字符重新插入到缓冲区当前指针所指位置,后面仍然会读取该字符。

    例7:
    #include <iostream>
    using namespace std;
    
    int main()
    {
        char a[10];
        cin.get( a, 10, '7' );
        cout << a << endl;
        cin.ignore();
        cin.get( a, 10, '7' );
        cout << a << endl;
        cin.putback(a[8]);
        cin.putback(a[7]);
        cin.get( a, 10 );
        cout << a << endl;
        return 0;
    }

    运行程序:

    12345678901234567890↙
    123456
    890123456
    567890

    在本例中最后一次使用get函数读入字符前,我们使用了两次putback函数,将上一次读入的最后两个字符从新放到缓冲区中,以供第三次调用get函数读入。
     
  • 相关阅读:
    C#数据库数据导出Excel通用方法
    统计数据库大小的方法
    ashx中使用HttpContext.Current.Session ,出现未将对象引用设置到实例上[转]
    ASP.NET数据库备份[转]
    XDocument读取xml的所有元素以及XPath语法[转]
    Datastage客户端安装 记录
    依赖注入控制反转 (摘抄记录)
    管道处理模型四——MVC原理(摘抄cainong2005博客)
    管道处理模型三(摘抄cainong2005博客)
    管道处理模型二(摘抄cainong2005博客)
  • 原文地址:https://www.cnblogs.com/yongpan/p/7997878.html
Copyright © 2020-2023  润新知