cin.ignore; cin.clear; cin.fail
Нашел пример кода с использованием этих функций, но не понимаю для чего они нужны и как работают
double getValue()
{
while (true) // цикл продолжается до тех пор, пока пользователь не введёт корректное значение
{
std::cout << "Enter a double value: ";
double a;
std::cin >> a
if (std::cin.fail()) // если предыдущее извлечение оказалось неудачным,
{
std::cin.clear(); // то возвращаем cin в 'обычный' режим работы
std::cin.ignore(32767,'\n'); // и удаляем значения предыдущего ввода из входного буфера
}
else // если всё хорошо, то возвращаем a
return a;
}
}
Ответы (1 шт):
Автор решения: AR Hovsepyan
→ Ссылка
Потоковые обьекты, такие как cin и cout, также как и любой другой обьект, имеют определенное состояние. Для них состояние оценивается установкой определенных бит, goodbit(установлен по умолчанию и имеет нулевое значение), badbit, failbit. Если по какой то причине поток "сломался", то установится badbit, и программа аварийно завершится. Если была попытка чтения типа, но невозможно читать его из буфера, то устанавливается состояние failbit.
std::cin.fail()будет означать: да, установленfailbit, поэтому любая попытка читать дальше, будет безуспешным.std::cinбудет ждать очистки всех установленных битов состояния.- Это делается функцией
std::cin.clear, вызов которого приводит к обнулению всех битов состояния, а это и естьgoodbit. Только после этого можем попытаться читать что то другое. Если мы решили, что в таком случаи(раз не было там числа) нужно пропустить строку и попытаться читать число в новой строке, то мы даем команду "игнорировать"(читать, но оставлять в буфере) много символов, пока не встретим символ перевода строки. std::cin.ignore(32767,'\n');и есть эта команда(вместо32767может быть любая большая цифра такая, что точно больше, чем количество символов до '\n')