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;
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Прекрасно компилируется в codeblocks а в Visual studio выдает
На фото есть кривая, которая в общем случае через каждые Δx состоит из двух точек (в реальности это координаты двух рядом проложенных проводов)
Какие преимущества дает использование 64-bit кода и 32-bit данных?