getline函数用法详解
getline函数简介
- 头文件包含
#include <stdio.h>
- 函数定义
ssize_t getline(char ** lineptr , size_t * n , FILE * stream );
ssize_t getdelim(char ** lineptr , size_t * n , int delim \
getline函数常见使用错误
- 编译错误
warning: implicit declaration of function ‘getline’ [-Wimplicit-function-declaration]
解决办法:包含头文件
#include <stdio.h>
getline函数详细描述
getline ()从stream读取整行,将包含文本的缓冲区的地址存储到"*lineptr" 中。缓冲区以空结尾,如果找到换行符,则包含换行符。
如果在调用之前"*lineptr"被设置为NULL,PPP1被设置为0,那么getline ()将分配一个缓冲区来存储该行。即使getline ()失败,用户程序也应该释放这个缓冲区。
或者,在调用getline ()之前,"*lineptr"可以包含一个指向malloc (3)-allocated缓冲区的指针,大小为"*n"字节。如果缓冲区不够大,无法容纳该行,getline ()会根据需要调整它的大小,realloc (3)会根据需要更新"*lineptr"和"*n"。
在这两种情况下,在成功调用时,"*lineptr"和"*n"将被更新,以分别反映缓冲区地址和分配的大小。
getdelim ()的工作方式类似于getline (),只是可以将换行符以外的行分隔符指定为delimiter参数。与getline ()一样,如果在到达文件结尾之前输入中没有分隔符,则不会添加分隔符。
getline函数返回值
成功后,getline ()和getdelim ()返回读取的字符数,包括分隔符字符,但不包括终止的空字节(\(aq\e0\(aq))。该值可用于处理读取行中嵌入的空字节。
这两个函数都在读取行失败时返回-1(包括文件结尾条件)。如果出现错误,errno被设置为指示原因。
getline函数错误码
- EINVAL 错误参数。RI(n或lineptr为空,或stream无效)。
- ENOMEM 分配或重新分配行缓冲区失败。
getline函数使用举例
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
FILE *stream;
char *line = NULL;
size_t len = 0;
ssize_t nread;
if (argc != 2) {
fprintf(stderr, "Usage: %s <file>\en", argv[0]);
exit(EXIT_FAILURE);
}
stream = fopen(argv[1], "r");
if (stream == NULL) {
perror("fopen");
exit(EXIT_FAILURE);
}
while ((nread = getline(&line, &len, stream)) != \-1) {
printf("Retrieved line of length %zd:\en", nread);
fwrite(line, nread, 1, stdout);
}
free(line);
fclose(stream);
exit(EXIT_SUCCESS);
}
评论区