stasnewar
Junior Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору задача с потоком cin решена. я был не прав, когда писал, что cin не воспринимает за ошибку, если ему дать другой тип, для данной переменной. ответ был прост, когда вводим "неправильный" тип, cin воспринимает это как за badbit, в потоке могут оставаться символы и cin воспринимает это, как за "правильно", т.е. как будто мы ввели данные, поэтому цикл прет "бесконечное" число, т.е. зависает. Решено двумя способами (наверняка есть и другие): 1. при помощи очистки буфера, при использовании cin.ignore() int inp; do { std::cin.clear(); //сбрасываем биты ошибок и устанавливаем goodbit для потока std::cin.ignore(std::cin.rdbuf()->in_avail()); //чистим буфер std::cin>>inp; if(!std::cin) //проверяем, все ли нормально std::cerr << "Tip dannych dolzen byt int!"<< std::endl; //если нет, то пишем switch(inp) { case 1: std::cout<<"Vveli 1"<<std::endl; inp = NULL; } }while(inp!=7); как видим, программа работает нормально при вводе любого типа. 2. при помощи cin.exceptions(), хотя смысл тот же: int inp; std::cin.exceptions(std::ios::failbit | std::ios::badbit); //прописываем исключение для потока cin do { try { std::cin >> inp; switch(inp) { case 1: std::cout<<"Vveli 1"<<std::endl; inp = NULL; } } catch(...) //описываем, что делать в случае ошибки { std::clog<<"Vveli nepravilnyj tip dannych!"<<std::endl; std::cin.clear(); //сбрасываем биты ошибок и устанавливаем goodbit для потока std::cin.ignore(INT_MAX, '\n'); //чистим буфер } }while(inp!=7); как видим, в обоих случаях все ровно используем очистку буфера и установку goodbit. спасибо всем, кто старался помочь! | Всего записей: 79 | Зарегистр. 01-03-2009 | Отправлено: 16:13 03-06-2010 | Исправлено: stasnewar, 16:47 03-06-2010 |
|