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
Что делает цикл «while(cin.getline(buf,l_buf))» ?
не могу понять,что делает цикл:while(cin.getline(buf,l_buf))-это по сути проверка на ввод строки.
Что делает функция?
void countFrequency( const std::string & str, int *frequency ) //принимаем строку, и указатель на.
Что делает функция
имеется вот такая функция. Обясние пожалуйста что она делает? что ето за команды которые она.
Регистрация: 07.10.2011
Сообщений: 117
Заблокирован
Функция getline считывает из входного потока N-1 символов(или меньше, если символ перевода строки встретится раньше).
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include #include #include using namespace std; const int n=99; int main(void) { char stroka[n]; cin.getline(stroka,n); //сччтываем массив символов coutstrokaendl; // выводим то, что считали cin.get(); }
139 / 60 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
mc.Duck, она тока считывает и все? а как работает функция tolower() просто написал программу она ошибку выбивает вот такую
error C2664: ‘tolower’ : cannot convert parameter 1 from ‘class std::basic_string,class std::allocator >’ to ‘int’
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Error executing cl.exe.
Заблокирован
Sylar9, getline считывает не одно слово, как cin, например, а целую строку до встречи с первым переводом на новую строку.
Метод tolower() преобразует символ таблицы Ascii из верхнего регистра в нижний.
Регистрация: 29.05.2014
Сообщений: 83
Можете объяснить почему на getline ругается?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
#include #include using namespace std; struct name{ char regicer[100]; char films[100]; int god; int dollar; };name lenta[40]; int main() {setlocale(LC_ALL, "RUS"); int i; for(i=1; i5;i++){ cout"Введите режиссера: "; cin.getline(lenta[i].regicer); cout"Введите название фильма: "; cin.getline(lenta[i].films); cout"Введите год выпуска фильма: "; cin.getline(lenta[i].god); cout"Введите стоимость: "; cin.getline(lenta[i].dollar); cin.get(); return(0); } }
Почетный модератор
![]()
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
Ринат, потому что вы в нее передаете только один параметр. Она не знает сколько символов надо считать.
Для ввода не строки, а одного единственного значения, к примеру числа, используйте перегруженный оператор ввода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
#include #include using namespace std; const unsigned size = 100; struct name{ char regicer[size]; char films[size]; int god; int dollar; }; name lenta[40]; int main() { setlocale(LC_ALL, "RUS"); for( int i=1; i40;i++ ){ cout"Введите режиссера: "; cin.getline(lenta[i].regicer, size); cout"Введите название фильма: "; cin.getline(lenta[i].films, size); cout"Введите год выпуска фильма: "; cin >> lenta[i].god; cout"Введите стоимость: "; cin >> lenta[i].dollar; cin.get(); return(0); } }
Как работает 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, ей я пользуюсь исключительно в учебных целях, закрепляю, так сказать, пройденный материал.
Отслеживать
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков
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; >