getline(3)

НАИМЕНОВАНИЕ
getline, getdelim - разделяет входные данные на строки

БИБЛИОТЕКА
Стандартная библиотека языка C (libc, -lc)

СИНТАКСИС
#include <stdio.h>

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

    Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

getline(), getdelim():
    Начиная с glibc 2.10:
        _POSIX_C_SOURCE >= 200809L
    До glibc 2.10:
        _BSD_SOURCE

ОПИСАНИЕ
Функция getline() считывает целую строку из stream, сохраняет адрес буфера с текстом в *lineptr. Буфер завершается null и включает символ новой строки, если был найден разделитель для новой строки.

If *lineptr is set to NULL before the call, then getline() will allocate a buffer for storing the line. This buffer should be freed by the user program even if getline() failed.

Как альтернатива, перед вызовом getline(), *lineptr может содержать указатель на буфер, выделенный с помощью malloc(3) размером *n байтов. Если буфер недостаточно велик для размещения строки, то getline() изменяет размер буфера с помощью realloc(3), обновляя *lineptr и *n при необходимости.

В любом случае при успешном выполнении вызова *lineptr и *n будут содержать правильный адрес буфера и его размер, соответственно.

Функция getdelim() работает аналогично getline(), за исключением того, что в аргументе delimiter можно задать разделитель строки, отличный от символа новой строки. Как и с getline(), символ-разделитель не добавляется, если его было в входных данных до конца файла.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
On success, getline() and getdelim() return the number of characters read, including the delimiter character, but not including the terminating null byte ('\0'). This value can be used to handle embedded null bytes in the line read.

At end of file, both functions return -1 with the file stream end-of-file indicator set. On error, both functions return -1 with the file stream error indicator set, and errno is set to indicate the error.

If *lineptr was set to NULL before the call, then the buffer should be freed by the user program even on failure.

ОШИБКИ

EINVAL
    Некорректные параметры (n или lineptr равно NULL или неправильное значение stream).

ENOMEM
    Не удалось выделить или переместить строчный буфер.

АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение
getline(), getdelim() | Безвредность в нитях | MT-Safe

СТАНДАРТЫ
POSIX.1-2008.

ИСТОРИЯ
GNU, POSIX.1-2008.

ПРИМЕРЫ
    #define _GNU_SOURCE
    #include <stdio.h>
    #include <stdlib.h>

    int
    main(int argc, char *argv[])
    {
        FILE *stream;
        char *line = NULL;
        size_t size = 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, &size, stream)) != -1) {
            printf("Retrieved line of length %zd:\n", nread);
            fwrite(line, nread, 1, stdout);
        }

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

СМОТРИТЕ ТАКЖЕ
read(2), fgets(3), fopen(3), fread(3), scanf(3)

ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (debian-l10n-russian@lists.debian.org).