C++输入相关的成员函数
本节我们介绍一下输入相关的常用的类成员函数。
不带参数的 get() 函数,其功能是从输入流中读入一个字符,并将其返回,但遇到文件结束符时则返回文件结束标识 EOF,文件结束符标识是采用宏定义的形式定义出来的,它的宏定义形式如下:
【例 1】
带有一个参数的 get() 函数,其参数是一个 char 型变量,用于存放读入的单个字符。同时函数的返回值不再是读入的字符,而是 bool 类型,读取成功时函数返回一个非 0 值,当读取失败则返回 0,相当于 false,此时则停止读入字符。
【例 2】
带有三个参数的 get() 函数第一个参数是字符数组或字符指针,用于将读入的字符串存入到字符数组或指针所指向的内存空间;第二个参数为读入字符个数;最后一个参数为读取的终止字符。如果未读满指定的个数就碰到了终止字符,则会提前终止读入字符。函数读取成功返回一个非 0 值,读入失败或遇到文件终止符则返回 0,即为 false。
【例 3】
在系统类库中,get() 函数并非只有这三种语法格式,不过这三种使用的频繁一些,其它的重载形式可以参考 C++ 类库手册。
【例 4】
getline() 读取输入的字符时,终止字符是不被读入的,碰到一个终止字符就终止本次读入操作,同时指针向后移动一位,指向终止字符的后一个字符,以便下次从终止字符后面的一个字符继续读入。而带三个参数的 get() 函数碰到终止字符则停止读入,指针并不会向后移一位,下次读入的时候仍从终止字符处开始读取,如果这一次读取的终止字符与上一次读入时的终止字符相同,则本次读入将不能读到字符。这就是 getline() 函数和带三个参数的 get() 函数的差别。
【例 5】
【例 6】
【例 7】
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
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() 函数,每次从输入流中读入一个字符,put() 函数都会将其输出,如此循环直到遇到文件结束符,运行结果为:(
↙
表示用户按下 Enter 换行键)
Abcdefghi 12340_+<.>?↙
Abcdefghi 12340_+<.>?↙
Asdf sss00.kkksk↙
Asdf sss00.kkksk↙
Ctrl + z
文件结束符在不同的编译器上定义不同,在 Visual studio 环境中
Ctrl+z
就是 EOF。
带有一个参数的 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, '\n' ) ) { cout << a << endl; } cout << endl; return 0; }运行程序:
01234567890123456789↙
012345678
901234567
89
在系统类库中,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
getline() 读取输入的字符时,终止字符是不被读入的,碰到一个终止字符就终止本次读入操作,同时指针向后移动一位,指向终止字符的后一个字符,以便下次从终止字符后面的一个字符继续读入。而带三个参数的 get() 函数碰到终止字符则停止读入,指针并不会向后移一位,下次读入的时候仍从终止字符处开始读取,如果这一次读取的终止字符与上一次读入时的终止字符相同,则本次读入将不能读到字符。这就是 getline() 函数和带三个参数的 get() 函数的差别。
3) eof()函数
eof 是 end of file 的缩写,eof() 函数可以用于判断读入数据是否遇到文件结束符,如果遇到文件结束符则返回 true,否则返回 false。【例 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
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
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。