Книга: Linux программирование в примерах
3.2.1.9. Только GLIBC: чтение целых строк: getline() и getdelim()
3.2.1.9. Только GLIBC: чтение целых строк: getline()
и getdelim()
Теперь, когда вы увидели, как читать строки произвольной длины, вы можете сделать вздох облегчения, что вам не нужно самим писать такую функцию. GLIBC предоставляет вам для этого две функции:
#define _GNU_SOURCE 1 /* GLIBC */
#include <stdio.h>
#include <sys/types.h> /* для ssize_t */
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
Определение константы _GNU_SOURCE
вводит объявления функций getline()
и getdelim()
. В противном случае они неявно объявлены как возвращающие int
. Для объявления возвращаемого типа ssize_t
нужен файл <sys/types.h>
. (ssize_t
является «знаковым size_t
». Он предназначен для такого же использования, что и size_t
, но в местах, где может понадобиться использование также и отрицательных значений.)
Обе функции управляют для вас динамической памятью, гарантируя, что буфер, содержащий входную строку, достаточно большой для размещения всей строки. Их отличие друг от друга в том, что getline()
читает до символа конца строки, a getdelim()
использует в качестве разделителя символ, предоставленный пользователем. Общие аргументы следующие:
char **lineptr
Указатель на char*
указатель для адреса динамически выделенного буфера. Чтобы getline()
сделала всю работу, он должен быть инициализирован NULL
. В противном случае, он должен указывать на область памяти, выделенную с помощью malloc()
.
size_t *n
Указатель на размер буфера. Если вы выделяете свой собственный буфер, *n
должно содержать размер буфера. Обе функции обновляют *n
новым значением размера буфера, если они его изменяют.
FILE* stream
Место, откуда следует получать входные символы.
По достижении конца файла или при ошибке функция возвращает -1. Строки содержат завершающий символ конца строки или разделитель (если он есть), а также завершающий нулевой байт. Использование getline()
просто, как показано в ch03-getline.с
:
/* ch03-getline.c --- демонстрация getline(). */
#define _GNU_SOURCE 1
#include <stdio.h>
#include <sys/types.h>
/* main - прочесть строку и отобразить ее, пока не достигнут EOF */
int main(void) {
char *line = NULL;
size_t size = 0;
ssize_t ret;
while ((ret = getline(&line, &size, stdin)) != -1)
printf("(%lu) %s", size, line);
return 0;
}
Вот эта функция в действии, показывающая размер буфера. Третья входная и выходная строки намеренно длинные, чтобы заставить getline()
увеличить размер буфера:
$ ch03-getline /* Запустить программу */
this is a line
(120) this is a line
And another line.
(120) And another line.
A llllllllllllllllloooooooooooooooooooooooooooooooonnnnnnnnnnnnnnnngnnnggggggggggg llliiiiiiiiiiiiiiiiiiinnnnnnnnnnnnnnnnnnnneeeeeeeeee
(240) A llllllllllllllllloooooooooooooooooooooooooooooooonnnnnnnnnnnnnnnngnnnggggggggggg llliiiiiiiiiiiiiiiiiiinnnnnnnnnnnnnnnnnnnneeeeeeeeee
- 3.2.1.1. Исследование подробностей на языке С
- 3.2.1.2. Начальное выделение памяти: malloc()
- 3.2.1.3. Освобождение памяти: free()
- 3.2.1.4. Изменение размера: realloc()
- 3.2.1.5. Выделение с инициализацией нулями: calloc()
- 3.2.1.6. Подведение итогов из GNU Coding Standards
- 3.2.1.7. Использование персональных программ распределения
- 3.2.1.8. Пример: чтение строк произвольной длины
- 3.2.1.9. Только GLIBC: чтение целых строк: getline() и getdelim()
- 5.3. Чтение каталогов
- 13.3.4.2. Только GLIBC:
- Инструмент командной строки gbak
- Инструмент командной строки gfix
- Как выделить строку, столбец и ячейки
- Удобная операция объединения строк
- Работа со строками
- Преобразование строки в целое: stoi( )
- 4.4.3. Чтение и запись
- I. Только представьте!
- ПРИМЕР: СОРТИРОВКА СТРОК
- На сайтах я читаю только текст и не хочу платить за картинки. Как их отключить?