示例

#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>\n", 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 %zu:\n", nread);
        fwrite(line, nread, 1, stdout);
    }

    free(line);
    fclose(stream);
    exit(EXIT_SUCCESS);
}

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
getline(),getdelim()Thread safetyMT-Safe

说明

getline()从流中读取整行,并将包含文本的缓冲区地址存储到* lineptr中。如果找到缓冲区,则该缓冲区以null终止,并包括换行符。

如果在调用之前将* lineptr设置为NULL并将* n设置为0,则getline()将分配一个缓冲区来存储该行。即使getline()失败,该缓冲区也应由用户程序释放。

另外,在调用getline()之前,* lineptr可以包含一个指向分配了malloc(3)的缓冲区的指针* n个字节。如果缓冲区的大小不足以容纳该行,则getline()使用realloc(3)调整其大小,并根据需要更新* lineptr和* n。

无论哪种情况,在成功调用后,* lineptr和* n都会更新以分别反映缓冲区地址和分配的大小。

getdelim()与getline()相似,但可以将除newline之外的行定界符指定为定界符参数。与getline()一样,如果在到达文件末尾之前输入中不存在分隔符,则不会添加分隔符。

遵循规范

getline()和getdelim()最初都是GNU扩展。它们在POSIX.1-2008中进行了标准化。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

另外参见

read(2),fgets(3),fopen(3),fread(3),scanf(3)

返回值

成功时,getline()和getdelim()返回读取的字符数,包括定界符,但不包括终止空字节(aq \ 0aq)。该值可用于处理读取行中的嵌入式空字节。

如果无法读取行(包括文件结束条件),这两个函数都将返回-1。如果发生错误,则设置errno来指示原因。

错误说明

EINVAL
错误的参数(n或lineptr为NULL,或流无效)。
ENOMEM
行缓冲区的分配或重新分配失败。

语法

#include <stdio.h>

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

getline(),getdelim():

Since glibc 2.10:
_POSIX_C_SOURCE>= 200809L
Before glibc 2.10:
_GNU_SOURCE
GETLINE - Linux手册页

Linux程序员手册 第3部分
更新日期: 2020-06-09

名称

getline,getdelim-分隔字符串输入

日期:2019-08-20 18:00:27 来源:oir作者:oir