Из того, что я прочитал, cin.clear()
сбрасывает флаги, но как это очищает входной буфер?
Как cin.clear() очищает входной буфер?
- Я думаю, что думаю, что очищает входной буфер is
cin.ignore(numeric_limits<streamsize>::max(), '\n')
. Однако он используется сcin.clear()
для полного сброса cin. 08.07.2016
Ответы:
cin.clear()
не влияет на входной буфер. Как вы правильно прочитали, он сбрасывает флаги iostate
(технически заменяет их текущее значение на std::ios_base::goodbit
)
std::ios::clear()
только сбрасывает флаги ошибок, если это возможно. Если, например, нет потокового буфера (т. е. stream.rdbuf()
дает nullptr
), std::ios_base::badbit
по-прежнему остается установленным. Это единственный аффект. В частности, std::ios_base::clear()
не удаляет никаких символов из входного буфера.
Если вам нужно удалить символ из входного буфера, вам нужно сделать это явно. Например, вы можете использовать
stream.ignore();
, чтобы безоговорочно удалить следующий символ (если он есть; если его нет, поток получитstd::ios_base::eofbit
набор).stream.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
для удаления всех символов до первого встречающегося символа'\n'
включительно.- вы можете захотеть
ignore()
символов, в то время какstream.peek()
дает класс символов, который вам не нравится (например, покаisdigit(stream.peek())
даетfalse
)
std::cin >> k; getline(std::cin,a);
где k — целое число..!! я знаю, что это можно исправить с помощью cin.ignore();
, но в чем причина сбоя? 16.01.2016 \n
вызвала? 16.01.2016 cin.clear() не очищает буфер, а только перезаписывает текущие значения флага. Для получения более подробной информации вы можете посетить эту ссылку--> http://www.cplusplus.com/reference/ios/ios/clear/
И Вы можете найти хороший пример по этой ссылке -->http://web.eecs.utk.edu/~plank/plank/classes/cs102/Cin-Notes/
Действительно, cin.clear()
не влияет на входной буфер, он только устанавливает новое значение для внутренних флагов состояния ошибки потока.
Если вы хотите очистить символы, которые «сломали» вашу трансляцию, вы должны использовать cin.ignore()
(например, cin.ignore(10000,'\n');
)
Вы можете найти хорошее объяснение с интуитивными примерами здесь: http://www.arachnoid.com/cpptutor/student1.html
cin >> variable
? из-за `\n'? 16.01.2016Enter Pressed
, поэтому он выполняется/пропускается? 16.01.2016