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

Cin get c что это

  • автор:

Функция cin.get()

Объясните пожалуйста мне функцию cin.get() . Прочитал про него в Дейтел, но там как то не очень подробно и хорошо она описана. Может кто-то мне поподробнее рассказать, если не трудно?

Отслеживать
8,910 11 11 золотых знаков 31 31 серебряный знак 55 55 бронзовых знаков
задан 3 апр 2012 в 6:58
1,872 18 18 золотых знаков 75 75 серебряных знаков 132 132 бронзовых знака

А что, кроме Дейтолов других учебников и справочников не существует? И выход в интернет тоже перекрыли?

3 апр 2012 в 20:28

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Когда метод get() вызывается с аргументом типа char или вообще аргументов, он извлекает следующий символ ввода, даже если это пробел, знак табуляции или символ новой строки. Версия get(char& ch) присваивает входящий символ своему аргументу, а версия get(void) просто использует входной символ, преобразует его в целочисленный тип (обычно — int) и возвращает это значение.

Плюс пару слов об еще парочке перегруженных разновидностях:

istream &get (char *buf, streamsize num); istream &get (char *buf, streamsize num, char delim); 

Первая форма функции get() считывает символы в массив, на который ссылается указатель buf , пока не будет считан num — 1 символов, обнаружен символ перехода на следующую строку или достигнут конец файла. Эта функция записывает нулевой символ в конец массива, на который ссылается указатель buf . Символ перехода на новую строку не считывается (!). Он остается в потоке, пока не будет выполнена следующая операция ввода.

Вторая форма функции get () считывает символы в массив, на который ссылается указатель buf , пока не будет считан num — 1 символов, обнаружен символ delim или достигнут конец файла. Функция записывает нулевой символ в конец массива, на который ссылается указатель buf . Символ delim не считывается (!). Он остается в потоке, пока не будет выполнена следующая операция ввода.

cin.get() и его друзья

определенная в классе istream библиотеки по определению извлекает из входного потока один символ и возвращает его целочисленный код. Популярность ей принес тот факт, что ее удобно использовать в программах с консольным интерфейсом, которые запускаются не из консоли, например, из проводника или из графического интерфейса IDE. После завершения работы программы мы не сможем увидеть ее финальный вывод, поскольку выполнится инструкция return и программа завершится, закрывая «за собой» консольное окно.

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

Проблема в том, что работает cin.get() далеко не всегда. Почему? Рассмотрим ситуацию издалека.

Начнем с того, что же такое поток (stream). Ненаучным языком говоря, поток — последовательность символов. Источником символов может служить в частности клавиатура. Символы идут один за другим:

К ним возможен только последовательный доступ, но не произвольный, иными словами, чтобы извлечь из потока символ d , надо предварительно извлечь из него a , b и c . Извлеченный (прочитанный) символ удаляется из потока.

Надо сказать, что если по каким-то причинам из потока прочитаны не все символы до конца строки (символа ‘\n’ ) включительно, то после операции чтения поток не будет пустым. Два самых распространенных способа дают нам два хороших примера.

Уже рассматривавшаяся выше функция get() читает из потока один символ, так что если мы ввели несколько символов, то она оставит за собой непустой поток. И следующий вызов cin.get() будет обречен на «фиаско»: программа вместо того, чтобы остановиться и ждать пользовательского ввода, прочитает из входного потока очередной символ, оставшийся от предыдущего ввода, и продолжит свое выполнение. Или завершится «без спроса». Напомню, что get() возвращает приведенный к типу int код введенного символа, поэтому мы может использовать его в вышеприведенной инструкции — код просто будет выведен на экран.

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

2)
int a;
cin>>a;

Перегруженный оператор сдвига, использующийся для ввода данных из потока, который в свою очередь перегружен для работы с целыми числами (так как вызван с параметром a типа int ), считывает символы, являющиеся десятичными цифрами, до тех пор, пока не встретит нецифровой символ. Это может быть пробел, буква, табуляция, конец строки, и так далее.
Все эти символы остались в потоке. Даже если вы просто ввели число и нажали Enter, символ ‘\n’ остался в потоке.

На него и «нарывается» впоследствии cin.get() .

Следующая шуточная программка позволяет воочию увидеть «обидчика». Скомпилируйте ее, запустите и введите, к примеру,

Она выведет символ, на котором «споткнулся» cin.get() .

using namespace std;

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

1)
Функция

определенная в классе istream , извлекает из потока символы и отбрасывает их. Причем она так поступает либо с n символами, либо со всеми символами, пока в потоке не встретится символ, заданный параметром delim .

В нашем случае мы стремимся отбросить максимальное число символов, которое может содержать поток, до первого перевода строки включительно.

2)
streambuf* istream::rdbuf() const;
streamsize streambuf::in_avail();

У потока ввода есть буфер чтения, в котором он хранит символы. Мы обращаемся к нему, вызывая функцию rdbuf() . А любой уважающий себя буфер знает, сколько символов в нем содержится. Поскольку и мы хотим это узнать, мы вызываем функцию in_avail() этого буфера. Это количество символов нам и нужно проигнорировать, что достигается так:

cin.ignore(cin.rdbuf()->in_avail());

Второй параметр функции ignore() имеет значение по умолчанию, что делает его необязательным, и мы его просто опускаем при вызове.

3)
int istream::sync();

Использование функции sync() — путь наименьшего сопротивления. Она просто очищает поток от имеющихся в нем символов.

Почему этот способ самый сложный — поищите в Гугле (если есть желание). А я в это время порекомендую Вам выбрать более понравившийся из первых двух и пойду заниматься более полезными делами ��

Хотя нет, напоследок еще расскажу о функции

void ios::clear(iostate state = goodbit);

Эта функция восстанавливает поток, если он по какой-либо причине оказался в ошибочном состоянии. Например, из потока пытались прочитать число, а там в это время находились буквы. В этом случае, поток переводится в состояние отказа, и дальнейшие операции с ним неосуществимы. В том числе и cin.get() . Функция же clear() «очищает» состояние потока, делая его вновь веселым и работоспособным.

На закуску пример и ссылки.

cin.get() c++ что это

? объясните пожалуйста понятно для чего она нужна? ? ?я видел её вставляли вот так switch(cin.get()) Заранее спасибо!

Лучший ответ

Для извлечения из входного потока одного символа и возвращения его целочисленного кода.

Прототип: int istream::get();

Остальные ответы
cppstudy.wordpress.com/2009/03/27/cin-get-and-co
Похожие вопросы
Ваш браузер устарел

Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.

Функции-члены входного потока

Функции — члены потока ввода используются для дисковых операций ввода.

open

Если вы используете входной поток файлов ( ifstream ), необходимо связать этот поток с определенным файлом диска. Это можно сделать в конструкторе или использовать функцию open . В любом случае аргументы одни и те же.

Обычно при открытии файла, связанного с входным потоком ios_base::openmode (используется ios::in режим по умолчанию). openmode Список флагов см. в разделе ios_base::openmode . Флаги можно объединить с побитовой «или» ( | ) оператором.

Чтобы прочитать файл, сначала используйте fail функцию-член, чтобы определить, существует ли она:

istream ifile("FILENAME"); if (ifile.fail()) // The file does not exist . 

get

Неформатированная get функция-член работает как >> оператор с двумя исключениями. Во-первых, get функция включает символы пробела, а средство извлечения исключает пробелы при skipws установке флага (по умолчанию). Во-вторых, функция, скорее всего, get приведет к очистке связанного выходного потока ( cout например).

Вариант функции задает адрес буфера get и максимальное число символов для чтения. Это полезно для ограничения количества символов, отправленных в конкретную переменную, как показано в примере:

// ioo_get_function.cpp // compile with: /EHsc // Type up to 24 characters and a terminating character. // Any remaining characters can be extracted later. #include using namespace std; int main() < char line[25]; cout "; cin.get( line, 25 ); cout

Входные данные

1234 

Образец вывода

1234 

getline

Функция-член getline похожа на функцию get . Обе функции допускают третий аргумент, который указывает завершающий символ для входных данных. Значение по умолчанию — символ новой строки. Обе функции резервируют один символ для необходимого завершающего символа. Тем не менее, get оставляет конечный символ в потоке и getline удаляет конечный символ.

В следующем примере задается завершающий символ для потока ввода:

// getline_func.cpp // compile with: /EHsc #include using namespace std; int main( )

Входные данные

test 

read

Функция-член read считывает байты из файла в указанную область памяти. Аргумент length определяет количество прочтенных байтов. Если этот аргумент не включен, чтение останавливается при достижении физического конца файла или в случае файла в текстовом режиме при чтении внедренного EOF символа.

Этот пример считывает двоичную запись из файла заработной платы в структуру:

#include #include using namespace std; int main() < struct < double salary; char name[23]; >employee; ifstream is( "payroll" ); if( is ) < // ios::operator void*() is.read( (char *) &employee, sizeof( employee ) ); cout else < cout > 

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

seekg и tellg

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

#include #include using namespace std; int main( ) < char ch; ifstream tfile( "payroll" ); if( tfile ) < tfile.seekg( 8 ); // Seek 8 bytes in (past salary) while ( tfile.good() ) < // EOF or failure stops the reading tfile.get( ch ); if( !ch ) break; // quit on null cout > else < cout > 

seekg Чтобы использовать для реализации систем управления данными, ориентированных на запись, умножьте размер записи фиксированной длины на номер записи, чтобы получить положение байтов относительно конца файла, а затем используйте get объект для чтения записи.

Функция-член tellg возвращает текущую позицию в файле для чтения. Это значение имеет тип streampos , определенный typedef в . В следующем примере выполняется чтение файла и показ сообщения с позициями пробелов.

#include #include using namespace std; int main( ) < char ch; ifstream tfile( "payroll" ); if( tfile ) < while ( tfile.good( ) ) < streampos here = tfile.tellg(); tfile.get( ch ); if ( ch == ' ' ) cout > else < cout > 

close

Функция-член close закрывает файл диска, связанный с входным потоком файлов, и освобождает дескриптор файла операционной системы. Деструктор ifstream закрывает файл, но можно использовать close функцию, если нужно открыть другой файл для одного объекта потока.

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

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