Я думаю многие начинающие программисты С/C++ хотели, чтобы
при запросе о вводе целого числа пользователь мог ввести только его, а никак не
double или char, который преобразовывается в int. Сегодня
я опишу как это сделать. #include <iostream>
using namespace std; /* Функция, восстанавливающая поток ввода в случае ошибки.*/ void
skip_to_int() {
if (cin.fail() )
{
cin.clear();
char ch;
while ( cin >> ch && !(
isdigit(ch) ) );
if (!cin) cerr << ("Is not
input");
cin.unget();
} } /* Собственно
это и есть вызываемая функция, не позволяющая ввести значение другого
типа. Например, если хотим ввести значение типа bool,
то пишем:
bool value = -1; value = the_contol_input
<bool> ; И
ввод будет продолжаться до тех пор, пока не введём 0 или 1.*/ template
<typename Type> /*
напомню, что для шаблонных функций нет разделения на ".cpp" и
".h". */ Type
the_control_input() {
Type n=0;
while (true)
{
if (cin >> n) return n; /* если введённое значение не принадлежит типу Type - идём
дальше.*/
cout << "It is not number. Repeat
input!\n";
skip_to_int();
} } А
теперь поговорим о работе с функциями из файла <iostream>: Поток
- это последовательность символов, к которым возможен только последовательный
доступ. Извлечённый символ удаляется из потока.
Если из потока прочитаны не все символы до конца строки ( символ
"\n") включительно, то после операции чтения поток не будет пустым. int
istream :: get() - извлекает из входного потока один символ и возвращает его
int-код Пример её неправильной работы:
cout << cin.get(); /* набираем abcd и жмём enter */
cout << cin.get(); /* программа, вместо того, чтобы ждать 2ого
пользовательского ввода прочитает символ 'b' */ istream& istream :: ignore (streamsize n=1, int
delim=EOF) Извлекает из потока символы и отбрасывает их. Причём поступает так либо с
"n" символами, либо со всеми символами, предшествующими символу
заданному параметром "delim". У
потока ввода есть буфер чтения, в котором он хранит символы. Обращение
к нему через streambuf*
istream::rdbuf() const; Количество
символов в нём равно streamsize streambuf::in_avail(); Пример
их использования:
cin.ignore ( cin.rdbuf()->in_avail() ); void ios::clear (iostate state = goodbit); Восстанавливает поток (если он оказался в ошибочном
состоянии), делая его работоспособным.
Например, при попытке прочитать число, когда в потоке были
буквы, поток переводится в состояние отказа и с ним нельзя работать (с
помощью того же cin.get(); )
|