get与getline函数

谈谈get和getline两个函数的浅显认识:

 

类模板basic_istream中有多个重载的get函数,其中最有代表性的3个,函数原型如下:

int istream::get();

istream& istream::get(char&);

istream& istream::get(char*, streamsize,char= '/n');

1get函数以int型返回从输入流中获取的一个字符,这里返回int型,而没有返回char型,是因为要返回-1,表示输入文件的结束;第2get函数有一个char型引用的参数,该函数将从输入流中获取的一个字符保存在参数中,并返回输入流对象本身;第3get函数有3个参数,第1个参数是char型的指针,第2个参数的类型是streamsize,相当于正整数,第3个参数是char型的变量,默认值是'/n',表示分隔符,该函数从输入流中获取字符串,保存在第1个参数指向的字符数组中,第2个参数表示一次可获取的最大数目,除了到达最大数目以外,这个获取动作可能会以遇到输入流中的分隔符结束,分隔符由第3个参数提供,默认是换行符'/n'

下面的getline完成与第3get函数类似的功能,其函数原型如下:

istream& istream::getline(char*, streamsize,char= '/n');

函数getline与第3个函数get的区别在于,函数get当遇到分隔符后,停止获取,并将分隔符留在输入流中,函数getline当遇到分隔符后,停止获取,但会将分隔符从输入流中取出。

 

看下面的代码

         ifstream in("c://hello.txt");

       char str[10];

2         while(in.get(str,10))

3         {

              cout<<str<<'/n';

5                in.get();

       }

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行代码使用第1get读取一个字符并丢弃。这是因为,第3get函数读取数据遇到分隔符时,停止读取并将分隔符留在输入流中,使用第1个版本的get函数读取一个字符并丢弃是为了将分隔符从输入流中取出,保证下一次循环执行第3个版本的get函数时,能够继续读取下一行数据。但是,使用getline函数不必向第5行代码那样,将读取分隔符取出并抛弃。这是因为getline函数读取数据遇到分隔符时,停止读取并将分隔符取出并直接抛弃(不存入str中)。

   

 

你可能感兴趣的:(c,basic)