C language get lines from a file using getline()

Ввод информации

При этом из входного потока читается последовательность символов до пробела, затем эта последовательность преобразуется к типу идентификатора, и получаемое значение помещается в идентификатор:

Возможно многократное назначение потоков: cin >> переменная1 >> переменная2 >>. >> переменнаяn;

При наборе данных на клавиатуре значения для такого оператора должны быть разделены символами (пробел,
, ).

Особого внимания заслуживает ввод символьных строк. По умолчанию потоковый ввод cin вводит строку до пробела, символа табуляции или перевода строки.

Результат выполнения

Для ввода текста до символа перевода строки используется манипулятор потока getline() :

Результат выполнения

Манипуляторы потока

Функцию – манипулятор потока можно включать в операции помещения в поток и извлечения из потока ( >).

В С++ имеется ряд манипуляторов. Рассмотрим основные:

Манипулятор Описание
endl Помещение в выходной поток символа конца строки ‘
dec Установка основания 10-ой системы счисления
oct Установка основания 8-ой системы счисления
hex Установка основания 16-ой системы счисления
setbase Вывод базовой системы счисления
width(ширина) Устанавливает ширину поля вывода
fill(‘символ’) Заполняет пустые знакоместа значением символа
precision(точность) Устанавливает количество значащих цифр в числе (или после запятой) в зависимости от использования fixed
fixed Показывает, что установленная точность относится к количеству знаков после запятой
showpos Показывает знак + для положительных чисел
scientific Выводит число в экспоненциальной форме
get() Ожидает ввода символа
getline(указатель, количество) Ожидает ввода строки символов. Максимальное количество символов ограничено полем количество

Пример Программа ввода-вывода значения переменной в C++

Та же программа, написанная на языке Си

Пример Использование форматированного вывода

Результат выполнения

Еще один пример использования форматированного вывода: для t∈ с шагом 0,5 вычислить значение y=cos(t).

Результат выполнения

Я новичок в программировании, и у меня есть несколько вопросов по get() а также getline() функции в C ++.

Мое понимание двух функций:

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

Книга (C ++ Primer Plus), которую я читаю, предлагает использовать get() над getline() , Мое замешательство в том, что это не getline() безопаснее, чем get() так как он обязательно заканчивает строку ‘
‘ , С другой стороны, get() будет просто зависать символ во входной очереди, таким образом потенциально вызывая проблему?

DESCRIPTION top

       getline() reads an entire line from stream, storing the address of
       the buffer containing the text into *lineptr.  The buffer is null-
       terminated and includes the newline character, if one was found.

       If *lineptr is set to NULL and *n is set 0 before the call, then
       getline() will allocate a buffer for storing the line.  This buffer
       should be freed by the user program even if getline() failed.

       Alternatively, before calling getline(), *lineptr can contain a
       pointer to a malloc(3)-allocated buffer *n bytes in size.  If the
       buffer is not large enough to hold the line, getline() resizes it
       with realloc(3), updating *lineptr and *n as necessary.

       In either case, on a successful call, *lineptr and *n will be updated
       to reflect the buffer address and allocated size respectively.

       getdelim() works like getline(), except that a line delimiter other
       than newline can be specified as the delimiter argument.  As with
       getline(), a delimiter character is not added if one was not present
       in the input before end of file was reached.

Другие решения

get() извлекает char из char из потока и возвращает его значение (приведенное к целому числу), тогда как getline() используется для получения строки из файла строка за строкой. Обычно getline используется для фильтрации разделителей в приложениях, где у вас есть плоский файл (с тысячами строк) и вы хотите извлечь выходные данные (строка за строкой), используя определенный разделитель, а затем выполнить с ним некоторую операцию.

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

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

И еще, у меня такое ощущение, что я решаю задачу очень топорно, есть ли какое-то более элегантное решение? Особенно меня смущает количество проверок в предикате. Если такое решение есть, можно и без STL, ей я пользуюсь исключительно в учебных целях, закрепляю, так сказать, пройденный материал.

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

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

Adblock
detector