在我的印象中,getline函数经常出现在自己的视野里,模糊地记得它经常用来读取字符串
。但是又对它的参数不是很了解,今天又用到了getline函数,现在来细细地总结一下:
首先要明白设计getline函数的目的,其实很简单,就是从流中读取字符串。而且读取的方
式有很多,包括根据限定符,根据已读取的字符的个数。从这个函数的名称来看,它的直观
意义是从流中读取一行,但是大家不要被这表面的现象所迷惑。其实如果让我来为这个函数
去一个名字的话,或许我会取一个getString,因为它的目的本来就是从流中读取字符的序
列,而不是像get函数那样一次读取一个字符。
另外要注意,C++中有两个getline函数,一个是在string头文件中,定义的是一个全局的
函数,函数声明是istream& getline ( istream& is, string& str, char delim )与
istream& getline ( istream& is, string& str );另一个则是istream的成员函数,函
数声明是istream& getline (char* s, streamsize n )与istream& getline (char*
s, streamsize n, char delim );注意第二个getline是将读取的字符串存储在char数组
中而不可以将该参数声明为string类型,因为C++编译器无法执行此默认转换。
下面根据一个例子简单地介绍一下该函数:
test.txt文件如下所示:
abcd
efgh
ijk
现在先尝试全局函数getline。从函数声明中我们观察到两种函数声明的不同主要体现在参
数的个数上,如果是两个参数的话,那么默认的限定符便是‘
’了,但是如果声明了限
定符,'
'是否仍然有效呢?我写了如下程序做测试:
int main(){
int n = 6;
string tem;
ifstream infile("test.txt");
for(int i = 0;i<n;i++){
//getline(infile,tem);
getline(infile,tem,' ');
cout<<tem;
}
return 0;
}
输出结果是:
abcd
efg
从中可以看出换行符确实失效了。所以getline函数的限定符只有一个,是相互覆盖的。
再来看一下istream的getline函数:
int main(){
char a[3];
ifstream infile("test.txt");
infile.getline(a,3,'c');
cout<<a;
}
输出结果是a
其实istream的getline是在全局函数的getline函数的基础上,又多了一个终止读取的条
件,即根据已读取的字符的个数来判定,实际上是读取n-1个字符,因为最后要为‘