Правильный способ использования cin.неудача()
Как правильно использовать cin.fail();
?
Я делаю программу, где вам нужно что-то ввести. Это не очень ясно, если вам нужно ввести число или символ. Когда пользователь вводит символ вместо числа консоль сходит с ума. Как я могу использовать cin.fail()
исправить?
или есть способ лучше?
2 ответов
cin.fail()
возвращает true, если последняя команда cin не удалась, и false в противном случае.
пример
int main() {
int i, j = 0;
while (1) {
i++;
cin >> j;
if (cin.fail()) return 0;
cout << "Integer " << i << ": " << j << endl;
}
}
теперь предположим, что у вас есть текстовый файл - ввода.txt и его содержимое:
30 40 50 60 70 -100 Fred 99 88 77 66
когда вы будете запускать выше короткую программу на этом, это приведет к:
Integer 1: 30
Integer 2: 40
Integer 3: 50
Integer 4: 60
Integer 5: 70
Integer 6: -100
он не будет продолжаться после 6-го значения, поскольку он завершает работу после чтения седьмого слово, потому что это не целое число: cin.fail()
держит true
.
std::cin.fail()
используется для проверки наличия предыдущего ввода
преуспевший. Однако более идиоматично просто использовать
поток, как если бы это было логическое:
if ( std::cin ) {
// last input succeeded, i.e. !std::cin.fail()
}
if ( !std::cin ) {
// last input failed, i.e. std::cin.fail()
}
в контекстах, где синтаксис ввода позволяет либо число
для символа обычным решением является чтение его по строкам (или в
некоторая другая строковая форма), и проанализировать его; когда вы обнаружите, что
существует число, вы можете использовать std::istringstream
в
преобразовать его, или любое количество других альтернатив (strtol
, или
std::stoi
если вы имейте C++11).
, однако, возможно извлечь данные сразу от поток:
bool isNumeric;
std::string stringValue;
double numericValue;
if ( std::cin >> numericValue ) {
isNumeric = true;
} else {
isNumeric = false;
std::cin.clear();
if ( !(std::cin >> stringValue) ) {
// Shouldn't get here.
}
}