Что такое cin get в c
Русские Блоги
Подробное объяснение cin, cin.get (), getline ()
Тест первый: abcd ( Enter) abcd (вывод) efgh (ввод) efgh (вывод) Если количество вводимых пользователем символов строки впервые меньше 4, программа выполняется нормально!
Тест два: abcdefgh (Enter) abcd ( (Вывод) (вывод строки) Когда число символов, введенных пользователем в первый раз, больше 4, первая строка принимает первые четыре символа ввода, а вторая операция ввода не выполняется, вторая строка Выход пуст. (Обнаружение суперлиги Getline, не будет выполнять Cin после)
ВАЖНО: Когда cin >> читает данные из буфера, если первый символ в буфере является разделителем пробела, табуляции или новой строки, cin >> будет игнорировать и очищать его, Продолжайте читать следующий символ, если буфер пуст, продолжайте ждать. Однако, если чтение прошло успешно, разделитель после символа остается в буфере, а cin >> не обрабатывается 。 ( понимание )
Примечание:
:
2、cin.get()
Функция имеет три формата: без параметров, один параметр, два параметра: cin.get (), cin.get (char ch), cin.get (array_name, Arsize) Чтение персонажей: Введите конечное условие: введите Обработка символов завершения пары ключей: Не сбрасывайте Enter в буфере 、 пробел и таб (важно) 。 cin.get () и cin.get (char ch) используются для чтения символов, и их использование аналогично, то есть: ch = cin.get () и cin.get (ch) эквивалентны.
cin.get(array_name, Arsize) Используется для чтения строки, может принимать пробелы, встречается Enter Завершить ввод, прочитать символы в соответствии с длиной (Arsize), будет Отменить последний ввод символа ( Важно, но не выбрасывайте ПРОБЕЛ и TAB ) 。
3、cin.getline()
4, функция ошибки cin
Механизм обработки ошибок cin, и изучите несколько важных функций: cin.fail (), cin.bad (), cin.good (), cin.clear (), cin.ignore () и т. Д.
ios :: badbit 001 В потоке ввода (вывода) произошла фатальная ошибка, которая необратима
ios :: eofbit 010 достиг конца файла
ios::failbit 100 Не фатальная ошибка во входном (выходном) потоке может быть исправлена
Соответствующая функция 1 or true if rdstate & XX bit is nonzero; otherwise 0。
Недостаточно сбросить флаг ошибки! Было бы хорошо, если бы оставшиеся данные в буфере могли быть очищены! Давайте посмотрим на очень важную функцию ниже!
Функции-члены потока ввода
Функции — члены потока ввода используются для дисковых операций ввода.
Если используется входной поток файлов ( ifstream ), необходимо связать этот поток с конкретным файлом диска. Это можно сделать в конструкторе или можно использовать open функцию. В любом случае аргументы одни и те же.
Чтобы прочитать файл, сначала используйте функцию- fail член, чтобы определить, существует ли она:
Неформатированная get функция элемента работает как >> оператор с двумя исключениями. Во-первых, get функция включает пробелы, в то время как средство извлечения исключает пробелы при skipws установке флага (по умолчанию). Во-вторых, эта get функция менее вероятно приведет к тому, что связанный поток вывода ( cout например,) будет сброшен.
Вариант get функции указывает адрес буфера и максимальное число считываемых символов. Это полезно для ограничения количества символов, отправленных в конкретную переменную, как показано в примере:
Входные данные
Пример выходных данных
getline
getline Функция-член аналогична get функции. Обе функции допускают третий аргумент, который указывает завершающий символ для входных данных. Значение по умолчанию — символ новой строки. Обе функции резервируют один символ для необходимого завершающего символа. Однако get оставляет завершающий символ в потоке и getline удаляет завершающий символ.
В следующем примере задается завершающий символ для потока ввода:
Входные данные
чтение
Этот пример считывает двоичную запись из файла заработной платы в структуру:
Программа предполагает, что записи данных форматируются точно так же, как указано в структуре, без завершающего возврата каретки или символов перевода строки.
функции seekg и tellg
Чтобы использовать seekg для реализации систем управления данными, ориентированных на записи, умножьте размер записи фиксированной длины на номер записи, чтобы получить координату байта относительно конца файла, а затем используйте get объект для чтения записи.
close
close Функция члена закрывает файл диска, связанный с входным файлом потока, и освобождает файл операционной системы. ifstream Деструктор закрывает файл, но функцию можно использовать, close Если необходимо открыть другой файл для того же объекта потока.
cin.get() и его друзья
Функция
int istream::get();
определенная в классе istream библиотеки по определению извлекает из входного потока один символ и возвращает его целочисленный код. Популярность ей принес тот факт, что ее удобно использовать в программах с консольным интерфейсом, которые запускаются не из консоли, например, из проводника или из графического интерфейса IDE. После завершения работы программы мы не сможем увидеть ее финальный вывод, поскольку выполнится инструкция return и программа завершится, закрывая «за собой» консольное окно.
Функция get() же стандартного потока ввода cin заставляет систему ожидать ввода пользователем любого символа, который она считывает, и программа завершается.
Проблема в том, что работает cin.get() далеко не всегда. Почему? Рассмотрим ситуацию издалека.
Начнем с того, что же такое поток (stream). Ненаучным языком говоря, поток — последовательность символов. Источником символов может служить в частности клавиатура. Символы идут один за другим:
Надо сказать, что если по каким-то причинам из потока прочитаны не все символы до конца строки (символа ‘\n’ ) включительно, то после операции чтения поток не будет пустым. Два самых распространенных способа дают нам два хороших примера.
1)
cout
Уже рассматривавшаяся выше функция get() читает из потока один символ, так что если мы ввели несколько символов, то она оставит за собой непустой поток. И следующий вызов cin.get() будет обречен на «фиаско»: программа вместо того, чтобы остановиться и ждать пользовательского ввода, прочитает из входного потока очередной символ, оставшийся от предыдущего ввода, и продолжит свое выполнение. Или завершится «без спроса». Напомню, что get() возвращает приведенный к типу int код введенного символа, поэтому мы может использовать его в вышеприведенной инструкции — код просто будет выведен на экран.
Собственно вывод: если в конце программы cin.get() не ждет пользовательского ввода, значит, вы оставили за собой непустой входной поток.
2)
int a;
cin>>a;
Перегруженный оператор сдвига, использующийся для ввода данных из потока, который в свою очередь перегружен для работы с целыми числами (так как вызван с параметром a типа int ), считывает символы, являющиеся десятичными цифрами, до тех пор, пока не встретит нецифровой символ. Это может быть пробел, буква, табуляция, конец строки, и так далее.
Все эти символы остались в потоке. Даже если вы просто ввели число и нажали Enter, символ ‘\n’ остался в потоке.
Следующая шуточная программка позволяет воочию увидеть «обидчика». Скомпилируйте ее, запустите и введите, к примеру,
using namespace std;
Теперь, когда проблема очевидна, рассмотрим ее возможные решения. В порядке увеличения их сложности.
1)
Функция
В нашем случае мы стремимся отбросить максимальное число символов, которое может содержать поток, до первого перевода строки включительно.
cin.ignore(numeric_limits ::max(), ‘\n’);
2)
streambuf* istream::rdbuf() const;
streamsize streambuf::in_avail();
Второй параметр функции ignore() имеет значение по умолчанию, что делает его необязательным, и мы его просто опускаем при вызове.
3)
int istream::sync();
Использование функции sync() — путь наименьшего сопротивления. Она просто очищает поток от имеющихся в нем символов.
Почему этот способ самый сложный — поищите в Гугле (если есть желание). А я в это время порекомендую Вам выбрать более понравившийся из первых двух и пойду заниматься более полезными делами 😉
Хотя нет, напоследок еще расскажу о функции
Класс basic_istream
Синтаксис
Примечания
Большинство функций элементов, которые оператор перегрузки являются отформатированными входными функциями. Они следуют этому шаблону:
Многие другие функции-члены — это неформатированные входные функции. Они следуют этому шаблону:
Обе группы функций вызывают, setstate (eofbit) если они обнаруживают конец файла при извлечении элементов.
Объект basic_istream хранилища класса:
Счетчик извлечений для последней неформатированной операции ввода (вызывается count в предыдущем коде).
Пример
Подробнее о входных потоках см. в примере для класса basic_ifstream.
Конструкторы
Функции элементов
Операторы
Оператор | Описание |
---|---|
станции | Вызывает функцию для входного потока или считывает форматированные данные из входного потока. |
Оператор = | Назначает basic_istream справа от оператора этому объекту. Это назначение перемещения, включающее rvalue ссылку, которая не оставляет копии. |
Требования
Заголовок: IStream>
Пространство имен: std
basic_istream::basic_istream
Параметры
Правильно
Объект basic_istream для копирования.
Комментарии
Пример
Дополнительные сведения о входных потоках см. в примере для класса basic_ifstream.
basic_istream::gcount
Возвращает число символов, считанных во время последнего неформатированного ввода.
Возвращаемое значение
Комментарии
Используйте basic_istream::get для чтения символов без форматирования.
Пример
basic_istream::get
Считывает один или несколько символов из входного потока.
Параметры
count
Число символов для чтения из strbuf.
разделитель
Символ, который должен завершать чтение, если он встретился до Count.
str
Строка, в которую должна выполняться запись.
Канал
Символ для получения.
strBuf
Буфер, в который должна выполняться запись.
Возвращаемое значение
Форма get без параметров возвращает чтение элементов как целое число либо конец файла. Прочие формы возвращают поток (* this ).
Комментарии
После извлечения из функции элемента, который сравнивается с разделителем. В этом случае элемент помещается обратно в управляемую последовательность.
Пример
basic_istream::getline
Получает строку из входного потока.
Параметры
count
Число символов для чтения из strbuf.
разделитель
Символ, который должен завершать чтение, если он встретился до Count.
str
Строка, в которую должна выполняться запись.
Возвращаемое значение
Поток (* this).
Комментарии
После извлечения из функции элемента, который сравнивается с разделителем. В этом случае элемент не помещается обратно и не добавляется в управляемую последовательность.
Пример
basic_istream::ignore
Пропускает несколько элементов после текущей позиции чтения.
Параметры
count
Количество пропускаемых элементов от текущей позиции чтения.
Возвращаемое значение
Поток (* this).
Комментарии
Пример
basic_istream:: operator>>
Вызывает функцию для входного потока или считывает форматированные данные из входного потока.
Параметры
PFN
Указатель функции.
Val
Значение для чтения из потока.
Возвращаемое значение
Поток (* this).
Комментарии
также определяет несколько глобальных операторов извлечения. Дополнительные сведения см. в разделе operator ( ).
Пример
basic_istream::operator=
Назначает basic_istream справа от оператора этому объекту. Это назначение перемещения, включающее rvalue ссылку, которая не оставляет копии.
Параметры
Возвращаемое значение
Возвращает * this.
Комментарии
basic_istream::peek
Возвращает следующий символ для чтения.
Возвращаемое значение
Следующий символ для чтения.
Комментарии
Пример
basic_istream::putback
Помещает указанный символ в поток.
Параметры
Канал
Символ для помещения обратно в поток.
Возвращаемое значение
Поток (* this).
Комментарии
Пример
basic_istream::read
Считывает указанное количество символов из потока и сохраняет их в массиве.
Этот метод является потенциально опасным, так как зависит от вызывающего объекта при проверке правильности переданных значений.
Параметры
str
Массив, из которого должны считываться символы.
count
Количество символов, которые необходимо считать.
Возвращаемое значение
Поток ( *this ).
Комментарии
Пример
basic_istream::readsome
Считывает указанное число значений символов.
Этот метод является потенциально опасным, так как зависит от вызывающего объекта при проверке правильности переданных значений.
Параметры
str
Массив, в котором readsome сохраняет символы, которые считывает.
count
Количество символов, которые необходимо считать.
Возвращаемое значение
Комментарии
Эта неформатированная входная функция извлекается до подсчета элементов из входного потока и сохраняет их в strмассива.
Эта функция не ожидает входных данных. Она считывает все доступные данные.
Пример
basic_istream::seekg
Перемещает позицию чтения в потоке.
Параметры
pos
Абсолютное положение, в которое следует переместить указатель чтения.
off
Смещение для перемещения указателя чтения относительно пути.
Возвращаемое значение
Поток (* this).
Комментарии
Первая функция-член выполняет как абсолютный поиск, вторая функция-член выполняет относительный поиск.
Не используйте вторую функцию-член с текстовыми файлами, так как стандартный C++ не поддерживает относительный поиск в текстовых файлах.
Если fail имеет значение true, функции-члены не выполняют никаких действий.
Пример
basic_istream::sentry
Вложенный класс описывает объект, объявление которого структурирует форматированные и неформатированные входные функции.
Комментарии
Если _Istr. good имеет значение true, конструктор:
basic_istream::swap
Параметры
Комментарии
basic_istream::sync
Синхронизирует устройство ввода, связанное с потоком, с буфером потока.
Возвращаемое значение
basic_istream::tellg
Сообщает текущую позицию чтения в потоке.
Возвращаемое значение
Текущая позиция в потоке.
Комментарии
Пример
basic_istream::unget
Помещает самый последний считанный символ обратно в поток.
Возвращаемое значение
Поток (* this).
Комментарии
Поточный ввод-вывод в C++
Поточный ввод-вывод в C++ выполняется с помощью функций сторонних библиотек. В С++, как и в С, нет встроенных в язык средств ввода-вывода.
Библиотека iostream определяет три стандартных потока:
Для их использования в Microsoft Visual Studio необходимо прописать строку:
Для выполнения операций ввода-вывода переопределены две операции поразрядного сдвига:
Возможно многократное назначение потоков:
cout
Ввод информации
При этом из входного потока читается последовательность символов до пробела, затем эта последовательность преобразуется к типу идентификатора, и получаемое значение помещается в идентификатор:
Возможно многократное назначение потоков:
cin >> переменная1 >> переменная2 >>. >> переменнаяn;
При наборе данных на клавиатуре значения для такого оператора должны быть разделены символами (пробел, \n, \t ).
Особого внимания заслуживает ввод символьных строк. По умолчанию потоковый ввод cin вводит строку до пробела, символа табуляции или перевода строки.
Результат выполнения
Для ввода текста до символа перевода строки используется манипулятор потока getline() :
Результат выполнения
Манипуляторы потока
В С++ имеется ряд манипуляторов. Рассмотрим основные:
Манипулятор | Описание |
endl | Помещение в выходной поток символа конца строки ‘\n’ |
dec | Установка основания 10-ой системы счисления |
oct | Установка основания 8-ой системы счисления |
hex | Установка основания 16-ой системы счисления |
setbase | Вывод базовой системы счисления |
width(ширина) | Устанавливает ширину поля вывода |
fill(‘символ’) | Заполняет пустые знакоместа значением символа |
precision(точность) | Устанавливает количество значащих цифр в числе (или после запятой) в зависимости от использования fixed |
fixed | Показывает, что установленная точность относится к количеству знаков после запятой |
showpos | Показывает знак + для положительных чисел |
scientific | Выводит число в экспоненциальной форме |
get() | Ожидает ввода символа |
getline(указатель, количество) | Ожидает ввода строки символов. Максимальное количество символов ограничено полем количество |
Пример Программа ввода-вывода значения переменной в C++
Та же программа, написанная на языке Си
Пример Использование форматированного вывода
Результат выполнения
Еще один пример использования форматированного вывода: для t∈[0;3] с шагом 0,5 вычислить значение y=cos(t).
Результат выполнения