应用范围
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
stream:文件描述符
应用范围
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
stream:文件描述符
应用举例
#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;
fp = fopen("/etc/motd", "r");
if (fp == NULL)
exit(EXIT_FAILURE);
while ((read = getline(&line, &len, fp)) != -1)
{
printf("Retrieved line of length %zu :n", read);
printf("%s", line);
}
if (line)
free(line);
exit(EXIT_SUCCESS);
}
独特性(C++标准库函数)
#include
using namespace std;
int main( )
{
cout << "Type the letter 'a': ";
ws( cin );
char c[10]={'0'};
cin.getline(c,10,'#');//将getline换成get试试,情况就大不相同了
cout<
char ch=cin.get();
cout<<"ch="<
if(ch=='n')
{
cout<<"ch equals a new line operator "<
}
char ch2=cin.get();
cout<<"ch2= "<
cin.get(c,10);
cout<
cout<
cout<
cout << cin.gcount( ) << endl;
return 0;
}
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成员函数,其三个参数分别是接收字符的字符数组、字符数组的大小和终止字符(默认值为'n')。函数或者在读取比指定的最多字符数少一个字符后结束,或者在遇到终止字符时结束。为使字符数组(被程序用作缓冲区)中的输入字符串能够结束,空字符会被插入到字符数组中。函数不把终止字符放到字符数组中,但是终止字符仍然会保留在输入流中。
成员函数 getline与带三个参数的get函数类似,它读取一行信息到字符数组中然后插入一个空字符。所不同的是,getline要去除输入流中的终止字符,但是不把它存放在字符数组中。
当输入的字符数小于count时遇到字符delim,get函数不会读取delim这个字符,而getline函数将读取这个字符但是不存进array当中去,而是将其丢弃,当然,两者都会在读取的字符串后面自动加上'0'(teminator character)
当输入的字符数大于count时,则get函数只读取count-1个字符,而其余的字符仍然保存在缓冲区中,还可再对其进行读取;但是函数getline则不然。
如果输入行包含的字符数比指定要读取的字符多,那么get()和getline()读取指定数目的字符后,将把余下的字符留在输入队列中。对get()而言,我们可以用另一条读取函数来读取留在输入队列中的数据,你也可以写一段代码将余下的字符清除。不同的是getline()会设置失效位(faibit),并且关闭后面的输入,这个时候用ch=cin.get();是读取不到留在输入队列中的字符的。你可以用下面的命令来恢复输入:cin.clear();因为clear()会重置失效位,打开输入。这个时候ch=cin.get();就可以读取留在输入队列中的字符。
getline()接收一个字符串,可以接收空格,需要包含#in⁃clude
外加ignore用法举例一则:
// basic_istream_ignore.cpp
// compile with: /EHsc
#include
int main( )
{
using namespace std;
char chararray[10];
cout << "Type 'abcdef': ";
cin.ignore( 5, 'c' );//忽略前5个字符除非遇到字符'c',而停止忽略字符
//ignore的函数原型为:basic_istream& ignore(streamsize _Count = 1,int_type _Delim = traits_type::eof( ));(摘自MSDN)
cin >> chararray;
cout << chararray;
cout<
return 0;
}