getline是C++标准库函数;但不是C标准库函数,而是POSIX(IEEE Std 1003.1-2008版本及以上)所定义的标准库函数(在POSIX IEEE Std 1003.1-2008标准出来之前,则只是GNU扩展库里的函数)。getline会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束:1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。
名词释义
,作为输入的终止。终止符可以是默认的终止符,也可以是定义的终止符。函数的语法结构是:
getline(<字符数组chs>,<读取字符的个数n>,<终止符>)
在函数遇到和结束定界符相等的字符时函数结束,同时函数抽出定界符,此种情况下该定界符既不被放回输入流,也不被放入要生成的字符串。所以由此可以理解输入结束后的第一个回车是定界符,被确认后抛弃,而第二个才是程序执行运行时正常需要的。
应用范围
C 有 fgets(),gets() 函数,gcc编译器扩展定义了getline()函数。
使用条件
linux标准C中使用条件:
#if defined(_GNU_SOURCE) || _POSIX_C_SOURCE >= 200809L
#include
函数声明:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
返回值
成功:返回读取的字节数。
失败:返回-1。
参数:
lineptr:指向存放该行字符的指针,如果是NULL,则有系统帮助malloc,请在使用完成后free释放。
n:如果是由系统malloc的指针,请填0
应用举例
#if defined(_GNU_SOURCE) || _POSIX_C_SOURCE >= 200809L
#include
#include
int main(void)
{
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
if (fp == NULL)
exit(EXIT_FAILURE);
while ((read = getline(&line, &len, fp)) != -1)
{
}
if (line)
free(line);
exit(EXIT_SUCCESS);
}
独特性(C++标准库函数)
get(char*array,int count,char delim)与getline(char*array,int count,char delim)的不同点:
成员函数get有三种版本:无
参数的、带一个参数的带三个参数的。不带参数的get函数从指定的
输入流中提取(输入)一个字符(包括空白字符)并返回该字符;当遇到输入流中的文件结束符时,返回
EOF。为与
ASCII字符值有所区别,EOF的值通常为-1(不同系统中的EOF值有可能是不一样的)。带一个字符型参数的get成员函数自动提取输入流中的下一个字符(包括空白字符)。当遇到文件结束符时,函数返回0(假),否则返回对 Istream对象的引用,并用该引用再次调用get函数。带有三个参数的get成员函数,其三个参数分别是接收字符的字符数组、字符数组的大小和终止字符(默认值为'
')。函数或者在读取比指定的最多字符数少一个字符后结束,或者在遇到终止字符时结束。为使字符数组(被程序用作缓冲区)中的输入字符串能够结束,空字符会被插入到字符数组中。函数不把终止字符放到字符数组中,但是终止字符仍然会保留在输入流中。
成员函数 getline与带三个参数的get函数类似,它读取一行信息到
字符数组中然后插入一个空字符。所不同的是,getline要去除输入流中的终止字符,但是不把它存放在字符数组中。
当输入的字符数大于count时,则get函数只读取count-1个字符,而其余的字符仍然保存在缓冲区中,还可再对其进行读取;但是函数getline则不然。
如果输入行包含的字符数比指定要读取的字符多,那么get()和getline()读取指定数目的字符后,将把余下的字符留在输入队列中。对get()而言,我们可以用另一条读取函数来读取留在输入队列中的数据,你也可以写一段代码将余下的字符清除。不同的是getline()会设置失效位(faibit),并且关闭后面的输入,这个时候用ch=cin.get();是读取不到留在输入队列中的字符的。你可以用下面的命令来恢复输入:cin.clear();因为clear()会重置失效位,打开输入。这个时候ch=cin.get();就可以读取留在输入队列中的字符。
getline()接收一个字符串,可以接收空格,需要包含#in⁃clude,getline()和cin.getline()类似,但是后者属于istream流,而前者属于string流。
外加ignore用法举例一则: