Воскресенье, 19.05.2024, 04:35Приветствую Вас Гость | RSS
IT Solutions
Меню сайта
Наш опрос
Оцените мой сайт
Всего ответов: 407
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Блог


Главная » 2013 » Ноябрь » 18 » Контроль ввода в C и С++:
04:50
Контроль ввода в C и С++:

Я думаю многие начинающие программисты С/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(); )

Категория: С/C++ | Просмотров: 3076 | Добавил: B@R_LOG | Теги: Контроль ввода в С С++, защита от дурака в С С++, контроль cin в С++, контроль данных в С С++ | Рейтинг: 5.0/185
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Категории раздела
Полезное [0]
Windows [0]
С/C++ [6]
SEO [0]
WEB [0]
Поиск
Друзья сайта
  • МЫ в "ВКонтакте"
  • Архив записей
    Календарь
    «  Ноябрь 2013  »
    ПнВтСрЧтПтСбВс
        123
    45678910
    11121314151617
    18192021222324
    252627282930
    Система Orphus