谈谈get和getline两个函数的浅显认识:
类模板basic_istream中有多个重载的get函数,其中最有代表性的3个,函数原型如下:
int istream::get();
istream& istream::get(char&);
istream& istream::get(char*, streamsize,char= '/n');
第1个get函数以int型返回从输入流中获取的一个字符,这里返回int型,而没有返回char型,是因为要返回-1,表示输入文件的结束;第2个get函数有一个char型引用的参数,该函数将从输入流中获取的一个字符保存在参数中,并返回输入流对象本身;第3个get函数有3个参数,第1个参数是char型的指针,第2个参数的类型是streamsize,相当于正整数,第3个参数是char型的变量,默认值是'/n',表示分隔符,该函数从输入流中获取字符串,保存在第1个参数指向的字符数组中,第2个参数表示一次可获取的最大数目,除了到达最大数目以外,这个获取动作可能会以遇到输入流中的分隔符结束,分隔符由第3个参数提供,默认是换行符'/n'。
下面的getline完成与第3个get函数类似的功能,其函数原型如下:
istream& istream::getline(char*, streamsize,char= '/n');
函数getline与第3个函数get的区别在于,函数get当遇到分隔符后,停止获取,并将分隔符留在输入流中,函数getline当遇到分隔符后,停止获取,但会将分隔符从输入流中取出。
看下面的代码
ifstream in("c://hello.txt");
1 char str[10];
2 while(in.get(str,10))
3 {
4 cout<<str<<'/n';
5 in.get();
6 }
7 in.close();
8 ifstream in1("c://hello.txt");
9 while(in1.getline(str,10))
10 cout<<str<<'/n';
11 in1.close();
注意2~~5行以及9~~10行之间代码的差异,第4行代码在输出str后,在第5行代码使用第1个get读取一个字符并丢弃。这是因为,第3个get函数读取数据遇到分隔符时,停止读取并将分隔符留在输入流中,使用第1个版本的get函数读取一个字符并丢弃是为了将分隔符从输入流中取出,保证下一次循环执行第3个版本的get函数时,能够继续读取下一行数据。但是,使用getline函数不必向第5行代码那样,将读取分隔符取出并抛弃。这是因为getline函数读取数据遇到分隔符时,停止读取并将分隔符取出并直接抛弃(不存入str中)。