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个,这是因为字符数组末尾的一个字符为’\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函数的差别。
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++输入相关的成员函数的更多相关文章
- C++学习46 getline()函数读入一行字符 一些与输入有关的istream类成员函数
getline函数的作用是从输入流中读取一行字符,其用法与带3个参数的get函数类似.即 cin.getline(字符数组(或字符指针), 字符个数n, 终止标志字符) [例13.7] 用get ...
- 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友
1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.另外一种初始化的方式是直接在构造方法里面实现初始化. 案比例如以 ...
- C++函数指针相关 & 类成员的指针 & 成员函数的指针
有时候会有指向类成员变量或者成员函数的指针,但是注意,这个指针并不是针对一个地址的指向,而更多的是一个偏移. 同时,支持将父类对象的成员 转为 子类对象的成员指针,如下: 反过来,是不行的.因为父类的 ...
- 深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)
本文转载自:http://blog.51cto.com/9291927/2148695 总结: 一.成员函数的内存为什么不会反映在sizeof运算符上? 成员函数可以被看作是类 ...
- 成员函数指针与高效C++委托 (delegate)
下载实例源代码 - 18.5 Kb 下载开发包库文件 - 18.6 Kb 概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(del ...
- 成员函数指针与高性能C++委托
1 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做“闭包(closure)”或“委托(delegate)”)在一些语言中已经证明了它宝贵的价值. ...
- [转]成员函数指针与高性能的C++委托
原文(作者:Don Clugston):Member Function Pointers and the Fastest Possible C++ Delegates 译文(作者:周翔): 成员函数指 ...
- MFC——4个基本类中的成员函数介绍
09121852 杜军 机械设计及理论 1. CMainFrame ActivateFrame使框架对用户可视并可用 CalcWindowRect每当主框架窗口的客户区尺寸发生变化或控制条的位置发生变 ...
- YTU 2636: B3 指向基类的指针访问派生类的成员函数
2636: B3 指向基类的指针访问派生类的成员函数 时间限制: 1 Sec 内存限制: 128 MB 提交: 433 解决: 141 题目描述 领导类(Leader)和工程师类(Engineer ...
随机推荐
- nginx根据CPU配置多线程运行
转自:Nginx使用教程(二):Nginx配置性能优化之worker配置 配置Nginx workers <br\>NGINX根据指定的配置运行固定数量的工作进程. 这些工作进程负责处理所 ...
- Java面试题整理---JVM篇
1.JVM运行时内存区域划分? 2.内存溢出OOM和堆栈溢出SOE的案例.原因.排查及解决? 3.常用的JVM性能监控工具? 4.JVM参数设置? 5.类加载过程? 6.JVM内存 ...
- Flutter 获取控件尺寸和位置
1. 插件必须渲染好, final RenderBox box = globalKey.currentContext.findRenderObject(); final size = box.size ...
- Django-debug-toolbar的使用
Django项目的开发过程中,离不开各种调试,那么,我们今天介绍一个工具,django debug toolbar,该工具为我们提供了更加丰富的调试信息,如提供session信息,SQL查询信息等等. ...
- 树莓派(centos7)安装mysql
yum install mysql mysql-server 或者 yum install mariadb mariadb-server 安装完后启动mysql systemctl start mar ...
- MYSQL 修改表结构基本操作一览
查看表的字段信息:desc 表名; 查看表的所有信息:show create table 表名; 添加主键约束:alter table 表名 add constraint 主键 (形如:PK_表名) ...
- 剑指offer(1)二维数组的查找
限制今天起开始也刷剑指offer啦,一步一步来. 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数, ...
- JS设计模式(12)装饰者模式
什么是装饰者模式? 定义:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且 ...
- 如何设置openwrt在编译linux内核时不优化内核?
答:修改openwrwt源码目录下rule.mk文件中的HOST_CFLAGS即可 将HOST_CFLAGS:=-O2 $(HOST_CPPFLAGS)改成: HOST_CFLAGS:=-O1 $(H ...
- luogu2046[NOI2010]海拔 对偶图优化
luogu2046[NOI2010]海拔 对偶图优化 链接 https://www.luogu.org/problemnew/show/P2046 思路 海拔一定是0或者1,而且会有一条01交错的分界 ...