Значение cin.fail () в C ++?

while (!correct)
{

cout << "Please enter an angle value => ";
cin >> value; //request user to input a value

if(cin.fail()) // LINE 7
{
cin.clear(); // LINE 9
while(cin.get() != '\n'); // LINE 10
textcolor(WHITE);
cout << "Please enter a valid value. "<< endl;
correct = false;

}
else
{
cin.ignore(); // LINE 18
correct =true;
}
}

Привет, это часть кода, который я написал.
Целью этого кода является ограничение пользователей на ввод чисел, таких как 10,10,00 и т. Д.,
если они вводят такие значения, как (abc,! $ @ и т. д.), код будет запрашивать у пользователей повторный ввод значений.

Чтобы выполнить эту функцию (запретить пользователю вводить действительные значения), я получаю несколько советов и руководств на форумах.

Я считаю, что я обязан изучать и понимать, что делают эти коды … так как я впервые использую этот код.
может кто-нибудь кратко объяснить мне, что делает коды в
Строка 7,9,10, а 18 сделать? Особенно строка 10. Я получил краткое представление о других, просто строка 10, я не знаю, что он сделал.

Спасибо за ваши гиды, я ценю это!

2

Решение

cin.fail() сообщает вам, «что-то не получилось» в предыдущей операции ввода. Я считаю, что есть четыре распознанных состояния входного потока: bad, good, eof а также fail (но fail а также bad может быть установлен одновременно, например).

cin.clear() сбрасывает состояние до good,

while(cin.get() != '\n') ; будет читать до конца текущей строки ввода.

cin.ignore(); будет пропускать до следующего перехода на новую строку, поэтому очень похож на while(cin.get() != '\n');,

Весь код должен также проверять конец файла, или он будет зависать (цикл навсегда с ошибкой), если не будет введен правильный ввод, а ввод «закончен» (например, CTRL-Z или CTRL-D в зависимости от платформы).

2

Другие решения

// LINE 7: cin.fail () определяет, соответствует ли введенное значение значению, определенному в переменной.

// LINE 18: cin оставляет символ новой строки в потоке. Добавление cin.ignore () к следующей строке очищает / игнорирует новую строку из потока.

1

Для строки 7 и строки 9 прочитайте документ.

while(cin.get() != '\n'); // LINE 10

в while, проверяет ли линия cin.get() является пустой строкой, т.е. содержит только новую строку.

0

Строка 7: проверить правильность введенных данных (можно прочитать как decltype(value)). cin.fail() всегда true если произошла ошибка с потоком. Позже

строка 9: вы очищаете cin состояние от плохого к предыдущему, нормальное состояние. (восстановить после ошибки). Вы не можете больше читать данные, пока не восстановитесь из плохого состояния.

Строка 10: вы читаете до конца строки. В основном вы пропускаете одну строку из ввода

Строка 18: эта строка выполняется, только если введенные данные исправлены. Он читает и отбрасывает одну строку из стандартного ввода.

0

while (cin.get ()! = ‘\ n’): вся строка в c заканчивается нулем. Это означает, что \ n является концом всех строковых объектов. Допустим, у вас есть строка «this» для c именно this \ n, каждый алфавит хранится в типе char. Пожалуйста, прочитайте вместе
http://www.functionx.com/cpp/Lesson16.htm

cin.fail (): cin.fail () определяет, соответствует ли введенное значение значению, определенному в переменной.

читать:http://www.cplusplus.com/forum/beginner/2957/

cin.ignore (): извлекает символы из последовательности ввода и отбрасывает их
http://www.cplusplus.com/reference/istream/istream/ignore/

0

Я знаю, что в Stack Overflow не принято просто перечислять ссылки, поэтому я приведу немного больше деталей, но этот ответ действительно сводится к куче ссылок.

Для строки 7 просто гуглите cin.fail. Вот хорошая ссылка, и что это говорит:

Возвращает значение true, если для потока установлены флаги состояния сбоя или ошибки бита (или обоих).

По крайней мере один из этих флагов устанавливается, когда во время операции ввода возникает какая-либо ошибка, отличная от достижения конца файла.

failbit обычно устанавливается операцией, когда ошибка связана с внутренней логикой самой операции; дальнейшие операции в потоке могут быть возможны. В то время как badbit обычно устанавливается, когда ошибка влечет за собой потерю целостности потока, которая, вероятно, сохранится, даже если в потоке предпринята другая операция. Badbit можно проверить независимо, вызвав функцию-член bad:
Однострочный перевод: он сообщает, произошла ли непредвиденная ошибка при попытке чтения входного потока.

Вы можете найти похожие ссылки для cin.ignore, cin.clear а также cin.get. Краткое резюме:

cin.ignore — игнорировать один единственный символ, присутствующий в потоке.
cin.clear — очистить все флаги ошибок в потоке
cin.get — получить по одному персонажу за раз, пока вы не нажмете на новую строку '\n' персонаж.

0

Стандартный поток ввода (cin) может потерпеть неудачу по ряду причин.

Например, если value является intи пользователь вводит большое число, как
124812471571258125, cin >> value потерпит неудачу, потому что число слишком велико, чтобы поместиться в int,

Существует гораздо более простой способ сделать то, что вы хотите. Вы хотите, чтобы пользователь вводил только допустимые значения с плавающей точкой, например, 10 или 10.00, но без символов, верно? Так что вы можете просто сделать это:

double value;
cout << "Please enter an angle value: " << endl;
while (!(cin >> value)) { //Since value is a double, (cin >> value) will be true only if the user enters a valid value that can be put inside a double
cout << "Please enter a valid value:" << endl;
}

Это делает то же самое, что и ваш код, но гораздо проще.

Если вы заинтересованы в том, что может вызвать другие вещи cin чтобы потерпеть неудачу, посмотрите здесь:
http://www.cplusplus.com/forum/beginner/2957/

0
По вопросам рекламы ammmcru@yandex.ru