参考: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. POJ 2533 裸的LIS

    A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given ...

  2. 判断(if)语句

    目标 开发中的应用场景 if语句体验 if语句进阶 综合应用 一 开发中的应用场景 转换成代码 判断的定义 如果 条件满足,才能做某件事 如果 条件不满足,就做另外一件事,或者什么也不做 判断语句 又 ...

  3. Vue基础进阶 之 过渡效果

    进入/离开过渡效果:Vue在插入.更新或移除DOM时,可以设置一些动画效果: 如何使用过渡效果:利用<transition></transition>组件将需要应用的过渡效果的 ...

  4. JavaScript Dom 绑定事件

    JavaScript  Dom 绑定事件 // 先获取Dom对象,然后进行绑定 document.getElementById('xx').onclick document.getElementByI ...

  5. mac 遇到的奇怪问题?

    1: 卸载 xcode,发现git报错了. mac git xcrun error active developer path 错误 解决办法:sudo xcode-select -switch / ...

  6. Oracle 12c 的RMAN备份

    备份 rman只备份cdb 只备份CDB数据库需要具有SYSDBA或SYSBACKUP权限用户连接到CDB的root环境下,执行backupdatabase root命令即可完成对CDB的备份,方法如 ...

  7. 清华集训2017 Day 2简要题解

    *注意:这套题目题面请在loj / uoj查看 从这里开始 题目列表(loj) Problem A 小 Y 和地铁 Problem B 小 Y 和二叉树 Problem C 小 Y 和恐怖的奴隶主 训 ...

  8. 王之泰201771010131《面向对象程序设计(java)》第四周学习总结

    王之泰201771010131<面向对象程序设计(java)>第四周学习总结 第一部分:理论知识学习部分 第四章 1.类与对象的基础概念. a.类(class)是构造对象的模板或蓝图.由类 ...

  9. MySQL 变量类型

    用户定义的变量(前缀为@): 您可以访问任何用户定义的变量,而无需声明或初始化它.如果引用尚未初始化的变量,则其值为NULL和字符串类型. select @now2; NULL set赋值: set ...

  10. Learning-Python【11】:函数嵌套及作用域

    一.函数对象 函数是第一类对象:函数的内存地址(即函数名)可以像一个变量值一样去使用 1.变量值可以被引用,例如 x = 1,y = x def foo(): print('from foo') f ...