Как очистить буфер cin c
15 секунд пока прога в Sleep’e жмем любые клавиши, но ток не ентер(дефект тогда чуть по другому будет выглядеть).
тест
Delfigamer
> Работать с консолью напрямую через WinAPI.
спаб за ссылку.
у мя есть разные велосипеды решающие эту проблему(но без сина), но интересует все же сам std::cin.
Ну, знам очистить буфер можно: эмулируем нажатие ентер’а.
а затем уже запускаем чистый cin
Остается почистить экран, но так чтобы никто не заметил)
халтура, блин)
FordPerfect
Да, иначе тебе бы приходили все \b вместе с затёртыми символами.
Сейчас попробую написать пример.
Calls to fread(), fgets(), fgetc(), and getchar() work within
whatever FILE* buffered data is available, and when that data
is exhausted, the calls request that the FILE* buffer be refilled
by the system I/O layer.
When full buffering is turned on, that refill operation results in the
FILE* layer requesting that the operating system hand it a full
buffer’s worth of data; when buffering is turned off, that
refill operation results in the FILE* layer requesting that the
operating system return a single character.
As I indicated before, setting an input stream to be unbuffered
does NOT tell the operating system to tell the device driver
to go into any kind of «raw» single-character mode. There are
system-specific calls such as ioctl() and tcsetterm() that
control what the device driver will do.
Русские Блоги
Очистить входной буфер в C ++
Введение в проблему
Те, кто использовал C ++, понимают, что случайные ошибки ввода будут возникать в процессе использования ввода, что приведет к тому, что последующий ввод будет недействительным. C ++ продолжит использовать предыдущий случайный ввод, что приведет к неправильному запуску программы.
Входной буфер
Все данные, вводимые с клавиатуры, будь то символы или числа, сначала сохраняются в буфере в памяти, называемом буфером клавиатуры, или для краткости Входной буфер или Входной поток 。
Когда ввод с клавиатуры заканчивается, входные данные сохраняются во входном буфере, и cin Функция считывает данные прямо из входного буфера. Этот буферный механизм предусматривает, что только после получения клавиши Enter все входные данные будут отправлены в cin функция. Возврат каретки отмечает завершение одного ввода. Если данных недостаточно, он будет ждать, пока пользователь продолжит ввод; если данные избыточны, избыточные данные будут сохранены в буфере входного потока для следующего использования.
————————————————
Ссылка для справки: https://blog.csdn.net/zhao708981169/article/details/36392681
Как решить
1.cin.clear()
Это значение каждого идентификатора статуса: 
(перевод youdao)
Например: определите, что вводимая переменная является целым числом, но если мы введем другие символы, произойдет ошибка. cin Есть способ обнаружить эту ошибку: cin.rdstate() ; когда cin.rdstate() Если он возвращает 0 (т.е. ios :: goodbit), это означает, что ошибки нет, и вы можете продолжить вход или работу. Если он возвращает 2, возникает нефатальная ошибка (например, ios :: failbit), и вы не можете продолжить войти или работать.
в заключении:
cin.clear () может сделать биты состояния нормальными, но не может очистить входной буфер.
2.cin.sync()
Не все времена эффективны, вы можете обратиться к этому сообщению в блоге для получения подробной информации:
Грубо говоря: для входных потоков стандартных библиотек, таких как std :: cin, вызов sync () является поведением, «определяемым реализацией». Если ожидаемый эффект не достигается, вы можете проверить свой собственный компилятор (реализация стандартной библиотеки) документации, должно быть описание того, какое поведение он использует.
Просто посмотрите определение функции синхронизации? В исходном документе функция синхронизации определяется следующим образом:
Но обратите внимание на это предложение в китайском документе:
Для того, чтобы следующая операция чтения зафиксировала любые изменения, которые могли быть внесены в связанную входную последовательность после того, как буфер потока окончательно заполнил свою область сбора данных. Для этого sync () может очистить область сбора данных, или заполнить ее, или ничего не делать. Заметным исключением является Visual Studio, где эта операция сбрасывает необработанный вывод при вызове со стандартным потоком ввода.
Почему MSVC, который я использовал, является исключением, он не ароматный!

Как видите, ввод «#» по-прежнему не может продолжаться, а значение a по-прежнему равно 0.
Снова измените код, пусть другая строка получит «#» в буфере, чтобы увидеть, действительно ли он не очищен:

Как видите, я не ввел следующую строку, но получил символ «#» в буфере, и я могу продолжить переход к следующему циклу.
в заключении
В разных компиляторах функция синхронизации реализована по-разному, что делает ее функции разными.Я использую MSVC, который не может выполнять функцию очистки буфера.
3.cin.ignore()
numeric_limits ::max() Но это climits Максимальное значение, используемое потоком, определенное файлом заголовка, вы также можете заменить его на достаточно большое целое число.
————————————————
Исходная ссылка: https://blog.csdn.net/selina8921/article/details/79067941

Видно, что после вызова функции cin.ignore () str не может извлечь неправильный символ «#», что означает, что содержимое буфера игнорируется, но str по-прежнему не может быть вошел. Причина кроется вНе вызывала cin.clear () для восстановления бита состояния。
Для второго теста введите последовательно: ### 
Видно, что без добавления cin.clear () str все равно не сможет получить содержимое буфера, даже если cin.ignore () игнорирует только 1 символ и не может продолжать ввод.
Добавьте вызов функции cin.clear () перед cin.ignore (), выполните третий тест и введите: ###,1,my 
Видно, что после вызова функции cin.ignore () str может извлечь неправильный символ «##», что означает, что содержимое буфера игнорируется, но только один символ. игнорируется. В следующий раз вы можете продолжить ввод a и str.
в заключении:
Чтобы сделать буфер полностью пустым, самое безопасное решение:
Как мне очистить буфер cin?
Как очистить буфер cin в C++?
13 ответов
я пишу программу, в которой пытаюсь реализовать следующий код: int main() < string inputcmd; while (getline(cin, inputcmd))< cout >inputcmd; cin.ignore (std::numeric_limits ::max(), ‘\n’); if (inputcmd == make)< cout
Я бы предпочел ограничения размера C++ по сравнению с версиями C:
Также: Вы, вероятно, захотите сделать: std::cin.clear(); перед этим, чтобы сбросить состояние потока.
Это было единственное, что работало для меня при чтении с консоли. В любом другом случае он либо будет считываться бесконечно из-за отсутствия \n,, либо что-то останется в буфере.
EDIT: Я обнаружил, что предыдущее решение ухудшило ситуацию. THIS один, однако, работает:
Я нашел два решения этой проблемы.
Другой вариант, который непосредственно отбрасывает поток, заключается в следующем.
Есть пример, когда cin.ignore просто не сокращает его, но я не могу думать об этом в данный момент. Это было некоторое время назад, когда мне нужно было использовать его (с Mingw).
Таким образом, если вы используете его, ваш код не будет переносимым.
< int val; string str; cin >> val; cin >> str; > Когда я пишу программу C++, я столкнулся с проблемой. Я определяю переменную int val, и я пишу это: cin >> val, но я ввожу ‘g’. Когда я пишу следующее утверждение cin > > str; cin непосредственно использует ‘g’ снова, но это не мое.
Я программирую на ассемблере и создал вспомогательный буфер, чтобы временно хранить некоторые символы, а затем записывать их в файл. Дело в том, что мне приходится использовать вспомогательный буфер несколько раз, поэтому мне нужно очистить/восстановить его, и я не знаю, как это сделать. Я.
Другим возможным (ручным) решением является
Я не могу использовать fflush или cin.flush() с CLion, так что это пригодилось.
Самый простой способ:
Он просто помещает указатель cin в конец потока stdin, а cin.clear() очищает все флаги ошибок, такие как флаг EOF.
Должно сработать следующее:
В некоторых системах он недоступен, и тогда вы можете использовать:
а затем используйте функцию
Это сработало для меня. Я использовал for loop с getline().
Похожие вопросы:
Не могли бы вы, гуру Java, сказать мне, как очистить буфер System.err? Проблема в том, что я пытаюсь распечатать что-то с помощью out и ошибаюсь. В этом случае порядок вывода неверен, потому что это.
Как я могу очистить (очистить) буфер logcat в Android? Я использую adb logcat из командной строки и передаю вывод в файл, так как DDMS имеет очень ограниченный буфер. На данный момент, когда я.
Продолжение этого вопроса. Как я могу очистить входной буфер? sleep(2); // clear cin getchar(); Мне нужен только тот символ, который был введен последним, я хочу отбросить все входные данные.
я пишу программу, в которой пытаюсь реализовать следующий код: int main() < string inputcmd; while (getline(cin, inputcmd))< cout >inputcmd;.
< int val; string str; cin >> val; cin >> str; > Когда я пишу программу C++, я столкнулся с проблемой. Я определяю переменную int val, и я пишу это: cin >> val, но я ввожу ‘g’. Когда я.
Я программирую на ассемблере и создал вспомогательный буфер, чтобы временно хранить некоторые символы, а затем записывать их в файл. Дело в том, что мне приходится использовать вспомогательный буфер.
Я прошел через многие существующие ответы здесь StackOverflow, но я все еще застрял. код: int c; cin >> c; if(cin.fail()) < cout >shapetype; switch (shapetype) < case 'c': std::cout.
Как очистить буфер cin?
Как очистить буфер cin в C++?
12 ответов
также: вы, вероятно, хотите сделать: std::cin.clear(); перед этим тоже сбросить состояние потока.
Я бы предпочел ограничения размера c++ над версиями C:
Это было единственное, что работало для меня при чтении с консоли. В любом другом случае он будет либо читать бесконечно из-за отсутствия \n, либо что-то останется в буфере.
изменить: Я обнаружил, что предыдущее решение ухудшило ситуацию. Этот, однако, работает:
Я нашел два решения этой.
первое и самое простое-использовать std::getline() например:
. это отбросит входной поток, когда он попадет в новую строку. Подробнее об этой функции здесь.
другой вариант, который сразу отбрасывает поток этого.
есть пример, где cin.игнорировать просто не сократить его, но я не могу думать об этом в данный момент. Это было некоторое время назад, когда мне нужно было использовать его (с Mingw).
однако fflush (stdin) является неопределенным поведением в соответствии со стандартом. fflush () предназначен только для выходных потоков. fflush (stdin) работает только так, как ожидалось, в Windows (по крайней мере, с компиляторами GCC и MS)как расширение к стандарту C.
Так, если вы используете его, ваш код не будет переносимым.
Я не могу использовать fflush или cin.flush() с CLion, так что это пригодилось.
следующее должно работать:
в некоторых системах он недоступен, а затем вы можете использовать:
Как очистить буфер cin в c++
Я прошел через многие существующие ответы здесь StackOverflow, но я все еще застрял.
1 ответ
Продолжение этого вопроса. Как я могу очистить входной буфер? sleep(2); // clear cin getchar(); Мне нужен только тот символ, который был введен последним, я хочу отбросить все входные данные, которые были введены, пока программа спала. Есть ли способ сделать это? Кроме того, я не хочу активно.
я пишу программу, в которой пытаюсь реализовать следующий код: int main() < string inputcmd; while (getline(cin, inputcmd))< cout >inputcmd; cin.ignore (std::numeric_limits ::max(), ‘\n’); if (inputcmd == make)< cout
функция max() должна быть определена в начале файла. cin.ignore() очень хорошо работает для очистки буфера, однако вам нужна функция числовых ограничений max(), которая в моем случае давала ошибку.
добавьте эти строки сверху, и такая функция, как следующая, будет работать нормально.
Похожие вопросы:
Я пытаюсь проверить ввод таким образом, чтобы пользователь всегда должен был ввести кг или фунт, если он этого не сделает, то попросит пользователя вернуться. Он работает до этого момента, но не.
Как очистить буфер cin в C++?
Как я могу очистить (очистить) буфер logcat в Android? Я использую adb logcat из командной строки и передаю вывод в файл, так как DDMS имеет очень ограниченный буфер. На данный момент, когда я.
Продолжение этого вопроса. Как я могу очистить входной буфер? sleep(2); // clear cin getchar(); Мне нужен только тот символ, который был введен последним, я хочу отбросить все входные данные.
я пишу программу, в которой пытаюсь реализовать следующий код: int main() < string inputcmd; while (getline(cin, inputcmd))< cout >inputcmd;.
Именно то, что написано на жестянке. Есть ли способ опустошить входной буфер при подготовке к дальнейшему вводу пользователем без использования неопределенного fflush (stdin) или зацикленного.
< int val; string str; cin >> val; cin >> str; > Когда я пишу программу C++, я столкнулся с проблемой. Я определяю переменную int val, и я пишу это: cin >> val, но я ввожу ‘g’. Когда я.
У меня есть следующий код: char shapetype; std::cout > shapetype; switch (shapetype) < case 'c': std::cout.

