Other Alias
getlineОБЗОР
#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():
-
- Начиная с glibc 2.10:
- _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
- До glibc 2.10:
- _GNU_SOURCE
ОПИСАНИЕ
Функция getline() считывает целую строку из stream, сохраняет адрес буфера с текстом в *lineptr. Буфер завершается null и включает символ новой строки, если был найден разделитель для новой строки.Если *lineptr равно NULL и *n равно 0 перед вызовом, то getline() выделит буфер для хранения строки. Этот буфер должен быть высвобожден программой пользователя, даже если getline() завершилась с ошибкой.
Как альтернатива, перед вызовом getline(), *lineptr может содержать указатель на буфер, выделенный с помощью malloc(3) размером *n байтов. Если буфер недостаточно велик для размещения строки, то getline() изменяет размер буфера с помощью realloc(3), обновляя *lineptr и *n при необходимости.
В любом случае при успешном выполнении вызова *lineptr и *n будут содержать правильный адрес буфера и его размер, соответственно.
Функция getdelim() работает аналогично getline(), за исключением того, что в аргументе delimiter можно задать разделитель строки, отличный от символа новой строки. Как и с getline(), символ-разделитель не добавляется, если его было в входных данных до конца файла.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении getline() и getdelim() возвращают количество считанных символов, включая символ разделителя, но не включая завершающий байт null ('\0'). Это значение может использоваться для обработки встроенных байтов null при чтении строки.Обе функции возвращают -1 при ошибках чтения строки (включая условие достижения конца файла). При возникновении ошибки в errno сохраняется её значение.
ОШИБКИ
- EINVAL
- Некорректные параметры (n или lineptr равно NULL или неправильное значение stream).
АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).Интерфейс | Атрибут | Значение |
getline(), getdelim() | безвредность в нитях | безвредно (MT-Safe) |
СООТВЕТСТВИЕ СТАНДАРТАМ
Изначально, функции getline() и getdelim() были расширениями GNU. Позднее они были стандартизированы в POSIX.1-2008.ПРИМЕР
#define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> int main(void) { FILE *stream; char *line = NULL; size_t len = 0; ssize_t read; stream = fopen("/etc/motd", "r"); if (stream == NULL) exit(EXIT_FAILURE); while ((read = getline(&line, &len, stream)) != -1) { printf("Получена строка длиной %zu :\n", read); printf("%s", line); } free(line); fclose(stream); exit(EXIT_SUCCESS); }