Перейти к содержимому

Getline c что это

  • автор:

Как работает getline()?

Задача очень проста: на вход поступает количество принимаемых строк, и затем сами строки. На выход должно выйти (через пробел) количество гласных в этих строках.

// Подсчет гласных в строке #include #include #include #include using namespace std; class count_predicate < public: bool operator()(const char& expr) < if ( expr == 'a' || expr == 'o' || expr == 'i' || expr == 'u' || expr == 'y' || expr == 'e' ) return true; return false; >>; int main() < int N; // Нужное количество строк cin >> N; string strs[N]; for (int i = 0; i < N; i++) getline(cin, strs[i]); for (int i = 0; i < N; i++) < int n = count_if(strs[i].begin(), strs[i].end(), count_predicate()); cout return 0; > 

Когда вместо getline() я использую обычный cin>> , то все работает, но строки попадаются с пробелами, поэтому гласные считаются некорректно. Здесь же почему-то getline() каким-то образом «перебивает» cin сверху, и считывает количество строк как еще одну строку, как я понял из теста программы (но это не точно). Собственно, почему так происходит? И еще, у меня такое ощущение, что я решаю задачу очень топорно, есть ли какое-то более элегантное решение?
Особенно меня смущает количество проверок в предикате. Если такое решение есть, можно и без STL, ей я пользуюсь исключительно в учебных целях, закрепляю, так сказать, пройденный материал.

Отслеживать

219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков

Что такое getline в C++?

Функция getline используется для считывания строки из входного потока, такого как файл или стандартный ввод ( cin ). Эта функция позволяет считывать строки, включая пробелы, и сохранять их в переменных типа string .

#include #include int main() < std::string inputString; // Считывание строки из стандартного ввода (клавиатуры) std::cout 

В этом примере getline используется для считывания строки из стандартного ввода ( cin ). Она считывает всю строку, включая пробелы, и сохраняет ее в переменной inputString .

Getline c что это

#include
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 #include 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); >

Getline c что это

getline() считывает целую строку, сохраняя адрес буфера, содержащего текст, в *lineptr. Буфер завершается null и содержит символ новой строки, если был найден разделитель для новой строки.

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

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

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ

При нормальном завершении работы getline() и getdelim() возвращают номер считанных символов, включая символ разделителя, но не включая завершающий символ null. Это значение может использоваться для обработки встроенных символов null при чтении строки.

Обе функции возвращают -1 при ошибках чтения строки (включая условие достижения конца файла).

НАЙДЕННЫЕ ОШИБКИ

EINVAL Плохие параметры ( n или lineptr равно NULL или stream некорректно).

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ

#define _GNU_SOURCE #include stdio.h> #include stdlib.h> int main(void) < FILE * fp; char * line = NULL; size_t len = 0; ssize_t read; fp = fopen("/etc/motd", "r"); if (fp == NULL) exit(EXIT_FAILURE); while ((read = getline(&line, &len, fp)) != -1) < printf("Retrieved line of length %zu :\n", read); printf("%s", line); >if (line) free(line); return EXIT_SUCCESS; >

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *