getline, getwline, getdelim, getwdelim
|
Определено в заголовочном файле
<stdio.h>
|
||
| (1) | (dynamic memory TR) | |
| (2) | (dynamic memory TR) | |
| (3) | (dynamic memory TR) | |
| (4) | (dynamic memory TR) | |
stream
как с помощью
fgetc
, до тех пор пока не встретится
delimiter
, сохраняя символы в буфере размером
*n
, на который указывает
*lineptr
, автоматически увеличивая его размер как с помощью
realloc
, чтобы вместить весь ввод, включая разделитель, и добавляя нулевой терминатор. Указатель, возвращённый
realloc
, записывается обратно в
*lineptr
.
*lineptr
может быть нулевым, в этом случае предыдущее значение
*n
игнорируется и
getline
выделяет новый буфер как с помощью
malloc
. В любом случае окончательная длина выделенного буфера записывается в
*n
. Поведение не определено, если
delimiter
имеет значение вне диапазона
unsigned char
или
EOF
.
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)
|
получает широкую строку из файлового потока
(функция) |
|
выделяет память
(функция) |