Namespaces
Variants

getline, getwline, getdelim, getwdelim

From cppreference.net
Определено в заголовочном файле <stdio.h>
ssize_t getline ( char ** lineptr, size_t * n, FILE * stream ) ;
(1) (dynamic memory TR)
ssize_t getwline ( wchar_t ** lineptr, size_t * n, FILE * stream ) ;
(2) (dynamic memory TR)
ssize_t getdelim ( char ** restrict lineptr, size_t * restrict n,
int delimiter, FILE * stream ) ;
(3) (dynamic memory TR)
ssize_t getwdelim ( wchar_t ** restrict lineptr, size_t * restrict n,
wint_t delimiter, FILE * stream ) ;
(4) (dynamic memory TR)
1) Ведёт себя как getdelim ( lineptr, n, ' \n ' , stream )
2) Ведёт себя как getwdelim ( lineptr, n, L ' \n ' , stream )
3) Читает из потока stream как с помощью fgetc , до тех пор пока не встретится delimiter , сохраняя символы в буфере размером *n , на который указывает *lineptr , автоматически увеличивая его размер как с помощью realloc , чтобы вместить весь ввод, включая разделитель, и добавляя нулевой терминатор. Указатель, возвращённый realloc , записывается обратно в *lineptr . *lineptr может быть нулевым, в этом случае предыдущее значение *n игнорируется и getline выделяет новый буфер как с помощью malloc . В любом случае окончательная длина выделенного буфера записывается в *n . Поведение не определено, если delimiter имеет значение вне диапазона unsigned char или EOF .
4) То же, что и (3) , за исключением того, что символы читаются как если бы с помощью fgetwc и delimiter должен быть корректным wchar_t или WEOF .

Если *lineptr не является нулевым указателем, поведение не определено, если *lineptr не является указателем, который может быть передан в free или если *n больше размера выделенной памяти, на которую указывает *lineptr . Поведение также не определено, если n не является корректным указателем, подходящим для записи значения типа size_t .

Как и все функции из Dynamic Memory TR, getline гарантированно доступна только в том случае, если реализация определяет __STDC_ALLOC_LIB__ и если пользователь определяет __STDC_WANT_LIB_EXT2__ как целочисленную константу 1 перед включением заголовка stdio.h .

Содержание

Параметры

lineptr - указатель на указатель на начальный буфер или на нулевой указатель
n - указатель на размер начального буфера
delimiter - символ-разделитель
stream - корректный входной поток, открытый с помощью fopen

Возвращаемое значение

Количество символов, хранящихся в буфере, включая разделитель, но исключая нулевой терминатор.

При ошибке возвращает - 1 и устанавливает feof или ferror для stream .

Примечания

Эти функции идентичны своим 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)
получает широкую строку из файлового потока
(функция)
выделяет память
(функция)