2015-04-04 1 views
0

Как вручную сбросить std :: iostream :: сбой? У меня есть цикл try-catch, который вызывает исключение, когда пользователь пытается ввести нецелую строку, однако он не генерирует исключение, если пользователь пытается ввести float, поскольку он попытается прочитать все до десятичной точки в плавающей стоимости. Мое решение состоит в том, чтобы вручную исключить исключение, если в потоке все еще остаются данные, как это сделать?Как выбросить std :: iostream сбой в C++?

/* 
Sample Implementation Code in C++ 
Handling Inputs from User in C++ 
This code only stops running when the user 
inputs the appropriate values. Otherwise, the program 
will continue asking the user for input. 
*/ 

#include <iostream> 
#include <limits> //numeric_limits 
#include <stdexcept> 

int main() { 
    std::cin.exceptions(std::ios::failbit); // set exceptions to be thrown when a failbit is set 
    int num = 0; 
    int den = 0; 

    while (true) { 
     try { 
      std::cout << "Enter numerator: "; 
      std::cin >> num; 
      if(std::cin.peek() != '\n') { 
       //HOW TO DO THIS PART? 
       std::iostream::failure e; 
       throw e; 
      } 
      std::cout << "Enter denominator: "; 
      std::cin >> den; 
      std::cout << "The quotient is " << num/den << std::endl; 
     } catch (std::iostream::failure& e){ 
      std::cout << "Input should be an integer." << std::endl; 
      std::cin.clear(); 
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     } 
    } 

    return 0; 
} 
+0

by 'throw std :: iostream :: failure()'? – CollioTV

+0

ошибка: нет соответствующей функции для вызова 'std :: ios_base :: failure :: failure()' – DarkPotatoKing

+2

'std :: ios_base :: failure' имеет конструктор, который принимает строку сообщения. Что касается того, может ли быть выбрано исключение, правильная вещь сомнительна. – 0x499602D2

ответ

0

Видимо это так же просто, как:

throw std::iostream::failure(""); 

важная вещь, которую я забыл это пустая строка («»), так как он имеет конструктор, который принимает строку в качестве аргумента, но не пустота аргумент.

+3

Выполнение 'std :: cin.setstate (std :: ios_base :: failbit)', вероятно, будет много проще, хотя. – 0x499602D2

+0

Ох не знал этого, спасибо. вы хотели бы написать это как ответ, чтобы я мог его принять? – DarkPotatoKing

Смежные вопросы