getline, getwline, getdelim, getwdelim

< c‎ | experimental‎ | dynamic
定义于头文件 <stdio.h>
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
(1) (动态内存 TR)
ssize_t getwline(wchar_t **lineptr, size_t *n, FILE *stream);
(2) (动态内存 TR)
ssize_t getdelim(char ** restrict lineptr, size_t * restrict n,
                 int delimiter, FILE *stream);
(3) (动态内存 TR)
ssize_t getwdelim(wchar_t ** restrict lineptr, size_t * restrict n,
                 wint_t delimiter, FILE * stream);
(4) (动态内存 TR)
1) 表现同 getdelim(lineptr, n, '\n', stream)
2) 表现同 getwdelim(lineptr, n, L'\n', stream)
3) 如同用 fgetc 从流 stream 读取直至遇到 delimiter ,并将字符存储于 *lineptr 所指向的大小为 *n 的缓冲区,如同用 realloc 自动增加其大小以适应包含分隔符的整个输入,再加上空终止符。 *lineptr 可以为空,该情况下忽略 *ngetline 如同用 malloc 分配一个新缓冲区。 若 delimiter 拥有 unsigned char 范围外的值且非 EOF ,则行为未定义。
4)(3) ,除了如同以 fgetwc 读入字符,而 delimiter 必须是合法的 wchar_tWEOF

*lineptr 非空,则若 *lineptr 不是能传递给 free 的指针,或若 *n 小于 *lineptr 所指向内存的被分配大小,则行为未定义。

同所有来自动态内存 TR 的函数, getline 仅若实现定义了 __STDC_ALLOC_LIB__ 且用户在包含 stdio.h 前定义 __STDC_WANT_LIB_EXT2__ 为整数常量 1 才保证可用。

参数

lineptr - 指针,指向空指针,或指向指向最初缓冲区的指针
n - 指向最初缓冲区大小的指针
delimiter - 分隔字符
stream - fopen 打开的合法输入流

返回值

存储于缓冲区的字符数,包含分隔符,但排除空终止符。

错误时返回 -1 并设置 stream 上的 feofferror

注意

这些函数等同于其 POSIX 版本,除了允许但不要求在错误时设置 errno

示例

#ifdef __STDC_ALLOC_LIB__
#define __STDC_WANT_LIB_EXT2__ 1
#else
#define _POSIX_C_SOURCE 200809L
#endif
 
#include <stdio.h>
#include <stdlib.h>
void get_y_or_n(void)
{
    char *response = NULL;
    size_t len;
    printf("Continue? [y] n: ");
    if((getline(&response, &len, stdin) < 0) || (len && response[0] == 'n')) {
        free(response);
        exit(0);
    }
    free(response);
    return;
}
int main(void) 
{
    get_y_or_n();
}

输出:

Continue? [y] n:

参阅

从文件流获取一个字符串
(函数)
(C11 中移除)(C11)
stdin 读取一个字符串
(函数)
(C95)
从文件流获取一个宽字符串
(函数)
分配内存
(函数)