while (!(cin >> number) || (cin.peek() != '\n'))
{
cin.clear();
while (cin.get() != '\n')
;
cout << "Ошибка ввода. Введите заново:`введите сюда код` " << endl;
}
Не могу понять как он работает, что делают cin.peek(), !(cin >> a), cin.clear(), cin.get() Помогите разобраться.
С++
cin.peek() _ возвращает целочисленное представление следующего символа в буфере потока, не прочитав его
(cin >> a) при вводе значения a, если все нормально, то выражение
вернет true, соответственно !(cin >> a) вернет false (неудачу)
cin.clear() очистит все биты и установит бит по умолчанию
(std::ios_base::goodbit), таким образом приведя поток в рабочее
состояние.
cin.get() считывает один символ, но нигде не хранит
Таким образом имеем следующее:
while (!(cin >> number) || (cin.peek() != '\n'))
Пока попытка вводить с консоли значение number завершилась неудачей, или символ, следующий за последным прочитанным, не является '\n'(строка не закончилась). (Чушь какая то написана)
{
cin.clear();
очищаем cin, приводим его в рабочее состояние (установится состояние good)
while (cin.get() != '\n');
Читаем всю оставшуюся строку посимвольно(т.е. пока не встретим '\n')
cout << "Ошибка ввода. Введите заново:`введите сюда код` " << endl;
}
выводим на консоль сообщение об ошибке.
Вообшем написано плохо(ради чего вся остальная строка пропускается, непонятно), такой код нужно писать как: вводим число, если это не число или cin сломался по другой причине, поток приводим в рабочее состояние и игнорируем всю строку.
cin - это входной поток.
cout - это выходной поток.
cerr - это поток вывода сообщений об ошибках.
Для работы с этими операторами есть специальные поразрядные сдвиги:
>> - прочитать из входного потока.
<< - записать в выходной поток
От суда вывод, что cin - это ввод, из данного потока - читается последовательность символов до пробела и после помещается в идентификатор (переменную).
char c;
cin >> c;
Допустим, если взять строку состоящую из 2 и более слов, разделенными: пробелом, переводом строки, табуляцией, к примеру Тут Текст:
char s[10];
cin >> s;
cout << s << endl;
Вернет Тут.
Чтобы нам получить всю строку, нужно использовать манипулятор getline.
char s[10];
cin.getline(s, 10);
cout << s << endl;
Вернет Тут Текст.
Так-же поддерживается мульти-ввод:
cin >> var1 >> var2 >>...>> varN;
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости