要获取一行输入,有两种选择:成员函数get()或getline()。
两个函数都有三个参数:指向存储结果字符的缓冲区指针、
缓冲区大小(不能超过其限度)和停止读输入的终止符。
终止符有一个经常用到的缺省值”\n”。两个函数遇到输入
终止符时,都把零储存在结果缓冲区里。
其不同点是,get()遇到输入流的分隔符就停止,而不从输入流中提取分隔符。
如果用同样的分隔符再调用一次get()函数,它会立即返回而不带任何输入。
getline与其相反,它从输入流中提取分隔符,但仍没有把它储存到结果缓冲区里。
get有三种其它的重载版本:一个没有参数表,返回下一个字符,用的是一个int返回值;
一个把字符填进字符参数表,用一个引用;一个直接存储在另一个输入输出流对象的基本缓冲区结构里。
除没有参数表的get()外。所有get()和getline()的版本都返回字符来源的输入流,
没有参数表的get()返回下一个字符或EOF。如果取回输入流对象,要询问一下它是否正确,
我们可以用成员函数good()、eof()、fail()和bad()询问任何输入输入流是否正确。
下面程序说明了get()和getline()之间的区别:
#include <fstream> #include <iostream> #include <assert.h> using namespace std; #define SZ 100 //buffer size int main() { char buf[SZ]; { ifstream in("strfile.cpp"); //read assert(in); ofstream out("strfile.out"); //write assert(out); int i = 1; //line counter while(in.get(buf, SZ)) { //不会从输入流中提取分隔符,即分隔符还在输入流中 in.get(); //跳过分隔符 cout << buf <<endl; //必须加上\n out << i++ << ":" << buf <<endl; } } ifstream in("strfile.out"); assert(in); while(in.getline(buf,SZ)) { //会从输入流中提取分隔符,但不会放入结果缓冲区,即分隔符被丢弃了 char *cp = buf; while(*cp != ':') cp++; cp += 2; cout << cp <<endl; //必须加上\n } return 0; }