参考: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个,这是因为字符数组末尾的一个字符为’\0’。

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

本例程调用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 ;
}
运行程序

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[];
while ( cin.get( a, , '\n' ) )
{
cout << a << endl;
}
cout << endl;
return ;
}

运行程序:
01234567890123456789↙
012345678
901234567
89

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

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

2) getline函数

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

例4:

#include <iostream>
using namespace std; int main()
{
char a[];
cin.getline( a, , '' );
cout << a << endl;
cin.getline( a, , '' );
cout << a << endl;
cin.getline( a, );
cout << a << endl;
return ;
}

运行程序:
12345678901234567890↙
123456
890123456
890

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

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

本程序很简单,在while循环每次都判断是否读入到文件结束符,如果读入文件结束符则跳出循环。

4) ignore函数

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

例6:

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

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

12345678901234567890↙
123456
890123456
7890

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

5) peek函数

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

6) putback函数

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

例7:

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

运行程序:

12345678901234567890↙
123456
890123456
567890

在本例中最后一次使用get函数读入字符前,我们使用了两次putback函数,将上一次读入的最后两个字符从新放到缓冲区中,以供第三次调用get函数读入。

 

8.5 C++输入相关的成员函数的更多相关文章

  1. C++学习46 getline()函数读入一行字符 一些与输入有关的istream类成员函数

    getline函数的作用是从输入流中读取一行字符,其用法与带3个参数的get函数类似.即    cin.getline(字符数组(或字符指针), 字符个数n, 终止标志字符) [例13.7] 用get ...

  2. 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友

     1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.另外一种初始化的方式是直接在构造方法里面实现初始化. 案比例如以 ...

  3. C++函数指针相关 & 类成员的指针 & 成员函数的指针

    有时候会有指向类成员变量或者成员函数的指针,但是注意,这个指针并不是针对一个地址的指向,而更多的是一个偏移. 同时,支持将父类对象的成员 转为 子类对象的成员指针,如下: 反过来,是不行的.因为父类的 ...

  4. 深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)

    本文转载自:http://blog.51cto.com/9291927/2148695 总结: 一.成员函数的内存为什么不会反映在sizeof运算符上?             成员函数可以被看作是类 ...

  5. 成员函数指针与高效C++委托 (delegate)

    下载实例源代码 - 18.5 Kb 下载开发包库文件 - 18.6 Kb 概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(del ...

  6. 成员函数指针与高性能C++委托

    1 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做“闭包(closure)”或“委托(delegate)”)在一些语言中已经证明了它宝贵的价值. ...

  7. [转]成员函数指针与高性能的C++委托

    原文(作者:Don Clugston):Member Function Pointers and the Fastest Possible C++ Delegates 译文(作者:周翔): 成员函数指 ...

  8. MFC——4个基本类中的成员函数介绍

    09121852 杜军 机械设计及理论 1. CMainFrame ActivateFrame使框架对用户可视并可用 CalcWindowRect每当主框架窗口的客户区尺寸发生变化或控制条的位置发生变 ...

  9. YTU 2636: B3 指向基类的指针访问派生类的成员函数

    2636: B3 指向基类的指针访问派生类的成员函数 时间限制: 1 Sec  内存限制: 128 MB 提交: 433  解决: 141 题目描述 领导类(Leader)和工程师类(Engineer ...

随机推荐

  1. 雾霾天出行,如何精确避开“雷区”?2016 SODA数据侠十强

    (2016年参加了上海 SODA 竞赛,进入前十,最终获得上海市的两个奖项.) ▍跟踪雾霾,仅靠零星的监测点数据怎么行? 如果雾霾短期内没有办法彻底根治,我们可以做什么,把环境污染物对人的影响尽可能降 ...

  2. Six advantages of Nissan consult 3 diagnostic tool

    Today autonumen.com introduces Nissan consult 3. Nissan Consult 3 is a professional diagnostic tool ...

  3. 158A Next Round

    A. Next Round time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...

  4. ltp-ddt inverted_return小trick

    ./runtest/ddt/i2c_readwrite # @name I2C write read test on slave device# @desc I2C write read test o ...

  5. K8S学习笔记之kubernetes 日志架构

    0x00 概述 应用程序和系统日志可以帮助我们了解集群内部的运行情况,日志对于我们调试问题和监视集群情况也是非常有用的.而且大部分的应用都会有日志记录,对于传统的应用大部分都会写入到本地的日志文件之中 ...

  6. Python Semaphore

    Semaphore信号量的使用 信号量: 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人 ...

  7. opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形

    一.简介 二.外接矩形的查找绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //外接矩形的查找 ...

  8. (转)Awesome Human Pose Estimation

    Awesome Human Pose Estimation 2018-10-08 11:02:35 Copied from: https://github.com/cbsudux/awesome-hu ...

  9. UnicodeMath数学公式编码_翻译(Unicode Nearly Plain - Text Encoding of Mathematics Version 3)

    目录 完整目录 1. 简介 2. 编码简单数学表达式 2.1 分数 2.2 上标和下标 2.3 空白(空格)字符使用 3. 编码其他数学表达式 3.1 分隔符 强烈推荐本文简明版UnicodeMath ...

  10. easyUI使用dailog实现弹出框带表单功能

    本文为博主原创,未经允许不得转载: 示例如下: 需要注意的地方在id为win的div中需要有:closed="true"这个属性,这个属性为控制dailogn对话框显示与隐藏的属性 ...