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
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
11.4. Проверка для эффективного пользователя: euidaccess() (GLIBC)
11.4. Проверка для эффективного пользователя: euidaccess() (GLIBC) GLIBC предоставляет дополнительную функцию, которая работает подобно access(), но проверяет в соответствии с эффективными UID, GID и набором групп:#include <unistd.h> /* CLIBC */int euidaccess(const char *path, int amode);Аргументы и возвращаемое
13.3.4.2. Только GLIBC: <libintl.h>
13.3.4.2. Только GLIBC: <libintl.h> Для программ, которые будут использоваться лишь на системах с GLIBC, использование заголовочных файлов и макросов похоже, но проще:#include <stdio.h>#include <libintl.h>#define _(msgid) gettext(msgid)#define N_(msgid) msgid/* ... все остальное то же ... */Как мы видели ранее, заголовочный
6.1. Выбор возможностей glibc
6.1. Выбор возможностей glibc В glibc существует набор макросов для выбора возможностей. Эти макросы используются для выбора стандарта, которому будет подчиняться glibc. Иногда стандарты конфликтуют между собой, a glibc позволяет выбирать именно тот набор стандартов (формальный,
7.2. Средства проверки памяти, входящие в состав glibc
7.2. Средства проверки памяти, входящие в состав glibc Библиотека GNU С (glibc) предлагает три простых средства проверки памяти. Первые два — mcheck() и MALLOC_CHECK_ — вызывают проверку на непротиворечивость структуры данных кучи, а третье средство — mtrace() — выдает трассировку
3.1. Неочевидные особенности целых чисел
3.1. Неочевидные особенности целых чисел Аппаратная реализация целочисленной арифметики достаточно очевидна и в большинстве случаев не приносит неожиданностей. К тому же возможные проблемы в том или ином виде упомянуты во многих книгах по Delphi, поэтому даже начинающий
3.1.1. Аппаратное представление целых чисел
3.1.1. Аппаратное представление целых чисел Delphi относится к языкам, в которых целые типы данных максимально приближены к аппаратной реализации целых чисел процессором. Это позволяет выполнять операции с целочисленными данными максимально быстро, но заставляет
9.6. $RANDOM: генерация псевдослучайных целых чисел
9.6. $RANDOM: генерация псевдослучайных целых чисел $RANDOM -- внутренняя функция Bash (не константа), которая возвращает псевдослучайные целые числа в диапазоне 0 - 32767. Функция $RANDOM не должна использоваться для генераци ключей
Пример 22-6. Сравнение двух больших целых чисел
Пример 22-6. Сравнение двух больших целых чисел #!/bin/bash# max2.sh: Наибольшее из двух БОЛЬШИХ целых чисел.# Это модификация предыдущего примера "max.sh",# которая позволяет выполнять сравнение больших целых чисел.EQUAL=0 # Если числа равны.MAXRETVAL=255 # Максимально возможное
11.2.3. Отображение только повторяющихся строк
11.2.3. Отображение только повторяющихся строк Опция -d позволяет отобразить только те строки, которые встречаются несколько раз подряд:$ uniq -d myfile.txtMау
18.3.20. Добавление и проверка целых значений
18.3.20. Добавление и проверка целых значений В следующем примере рассматривается проверка чисел. Сценарий содержит набор значений счетчика, который легко изменяется при вводе пользователем нового числа. Затем сценарий добавляет это новое значение к постоянному значению,