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 0; }
本例程调用get函数,每次从输入流中读入一个字符,然后将其输出。如此循环直到遇到文件结束符。运行程序:(↙表示用户按下enter键)
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_+<.>?↙
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, '\n' ) ) { cout << a << endl; } cout << endl; return 0; }
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[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的第三个参数默认是‘\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 0; }
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函数,将这个终止字符忽略掉。忽略了终止字符后,第二次读入就不会有问题了。运行该例程:
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[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; }
运行程序:
123456
890123456
567890
在本例中最后一次使用get函数读入字符前,我们使用了两次putback函数,将上一次读入的最后两个字符从新放到缓冲区中,以供第三次调用get函数读入。