C как очистить cin
Перейти к содержимому

C как очистить cin

  • автор:

Полностью очистить буфер ввода

Как очистить буфер клавиатуры?
Есть меню в котором я двигаю стрелочку кнопками вверх и вниз и нажимаю ентер. while (true)

Очистить буфер функции после его обработки
Добрый день. Имеется некоторое приложение написанное на Delphi Исходных кодов нет. Описаны.

Как очистить поток ввода?
std::istringstream iss(s1); idd>>a; iss.clear();; s1=s3; iss>>b надо чтоб s3 в b записалось.

Как очистить поток ввода
cout << "Введите ряд целых чисел произвольной длины\n"; vector<int> vecint; int sum = 0; for.

Любитель чаепитий
3741 / 1798 / 565
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1

std::cin.ignore(std::numeric_limitsstd::streamsize>::max(), '\n');

99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170

ЦитатаСообщение от eXPonent Посмотреть сообщение

Но если пользователь вводил несколько Enter-oв во время работы проги
Как в этом случае поступить?
7595 / 6418 / 2924
Регистрация: 14.04.2014
Сообщений: 27,946
Как можно подряд несколько ‘\n’ ввести?
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170

Просто несколько раз натыкать
немного данных, немного Enter-ов
у нас так препод делал, и требовал, что бы в конфе прога, показывала лог
не сустем пауз, не син гет не помогали
Программа, просто мгновенно завершалась

Добавлено через 1 минуту

ЦитатаСообщение от eXPonent Посмотреть сообщение

cin.ignore(cin.rdbuf()->in_avail());

может её как то через цикл прогнать?

Добавлено через 1 час 2 минуты
может как нить можно ввести:
cin >> EOF; ?
что бы потом сделать

ЦитатаСообщение от GbaLog- Посмотреть сообщение

std::cin.ignore(std::numeric_limitsstd::streamsize>::max(), EOF); cin.get();

3434 / 2813 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426

ЦитатаСообщение от eXPonent Посмотреть сообщение

Просто несколько раз натыкать
немного данных, немного Enter-ов
Где натыкать? Как натыкать?

ЦитатаСообщение от eXPonent Посмотреть сообщение

у нас так препод делал, и требовал, что бы в конфе прога, показывала лог
не сустем пауз, не син гет не помогали

Покажи такой код.
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
Да любой код вида:

1 2 3
cin >> A; // какая-нить прога cin.get();

Просто, после выполнения cin >> A
долбишь по клаве интенсивно и нажимая попутно Enter-ы и пробелы
3434 / 2813 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426

ЦитатаСообщение от eXPonent Посмотреть сообщение

Да любой код вида:
Тип A какой?
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
int, string
неважно какого типа
у меня в проге int
3434 / 2813 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426

ЦитатаСообщение от eXPonent Посмотреть сообщение

неважно какого типа
Это тебе на важно, а cin >> важно.
Покажи, что со string у тебя остановки нет, в таком коде:

1 2 3 4 5
string A; cin >> A; cin.ignore(cin.rdbuf()->in_avail()); cout  "Stop"  endl; cin.get();

99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
Остановки нет:

1 2 3 4 5 6
string A; cin >> A; // добавил код для времени. cin.ignore(cin.rdbuf()->in_avail()); cout  "Stop"  endl; cin.get();

после ввода A:
465564
65465

Прога завершилась быстро.

3434 / 2813 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
Скрин ввода покажи. И код без этого (один ты знаешь, что там делается):

ЦитатаСообщение от eXPonent Посмотреть сообщение

// добавил код для времени.
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
Скриншот программы не удалось сделать, так как она быстро завершилась.
успел только код сфоткать
Любитель чаепитий
3741 / 1798 / 565
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1

Ты когда по клавиатуре долбишь, enter-то не нажимаешь? Потому как если ты его быстро жмешь, то пропускаешь момент, когда символы игнорятся и загружаешь туда новых переносов строки. После чего get срабатывает и программа завершается.

99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170

Нет, этот ввод делается в момент работы функции:

TranslationsXML();
и только!

Кликните здесь для просмотра всего текста

ввод:
465564
65465

Мне что видео записать?
с отлавливанием символов ввода?
Enter-ами как раз эта про и валится
или вы думаете нас препод просто так мучал, своим вводом с клавиатуры?

Добавлено через 3 минуты
И я уже предложил как обойти эту штуку, может кто нить подскажет как это реализовать?

ЦитатаСообщение от eXPonent Посмотреть сообщение

может как нить можно ввести:
cin >> EOF; ?
что бы потом сделать

std::cin.ignore(std::numeric_limitsstd::streamsize>::max(), EOF); cin.get();

или может есть ещё какой-нить непечатаемый символ, который можно занести в поток?
7595 / 6418 / 2924
Регистрация: 14.04.2014
Сообщений: 27,946

Как можно ввести несколько ‘\n’ подряд? Как только Enter нажат, ввод прекращается. Это какой-то побочный эффект, что ли?

3434 / 2813 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426

ЦитатаСообщение от nmcf Посмотреть сообщение

Как можно ввести несколько ‘\n’ подряд? Как только Enter нажат, ввод прекращается. Это какой-то побочный эффект, что ли?

Он это делает, не когда ввод, а когда его TranslationsXML() работает.

И что? Нажатия в буфере накапливаются? В общем я не понял, что там за проблема.

Меню пользователя @ nmcf

3434 / 2813 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426

ЦитатаСообщение от nmcf Посмотреть сообщение

Нажатия в буфере накапливаются?
Получается, что накапливаются. Этот код попробуй, увидишь (потыкай на Enter, пока цикл висит):

1 2 3 4 5 6 7 8 9 10
string A; cin >> A; for (int i = 0; i  100000000; ++i) { string str("absde"); str.clear(); } cin.ignore(cin.rdbuf()->in_avail()); cout  <"Stop"  ; cin.get();

Велосипедист.
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
Если проблема не решилась, попробуй вместо.

ЦитатаСообщение от eXPonent Посмотреть сообщение

cin.ignore(cin.rdbuf()->in_avail())
cin.sync();

Насколько мне известно, этот метод очищает буфер ввода. Но я слышал, что работает не везде.
Если не поможет, стандартное решение проблемы:

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

И да, у меня тот же вопрос.

ЦитатаСообщение от nmcf Посмотреть сообщение

Как можно подряд несколько ‘\n’ ввести?

ЦитатаСообщение от nmcf Посмотреть сообщение

Как можно ввести несколько ‘\n’ подряд?
Как может остаться несколько ‘\n’ ?
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Оъясните как работает консольный буфер ввода
Windows поддерживает "очередь сообщений" для каждой программы, работающей в данный момент в.

Очистить буфер сокета
имеется клиент-сервер,клиент отправляет сообщение принятое std::cin и пересылает серверу,тот в свою.

Как очистить буфер.
Извините, за вопрос из облатси VBA, но там в конфе глухо, да и проблема не только VBA’шная. .

Очистить буфер обмена
Подскажите как очистить буфер обмена на XE5 андроид. В VCL было ClipBrd,а тут не могу найти.

Как очистить поток ввода std::cin (консоль)?

Ввожу десять строк. Если строка равна «done», то выход.
Проблема в том, что если скопировать эти десять слов и вставить в консоли, то они продолжают вводиться уже после выхода из программы. Т.е. ошибка. Как полностью очистить консоль при выходе?
Попробовал так:
cin.clear(); // .
cin.ignore(INT_MAX); // .
Но так еще хуже. Строки допечатываются, но программа не завершается.

aa aaa bbb bbbb ccc ccc cccc dddddddddd eeeeeeeeeee done gggggg hhhhhh hhhh iii iiiii iiii
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#include #include #include using namespace std; int main() { string s; for (int i = 0; i  10; i++) { getline(cin, s); if (s == "done") { cout  <"done!"  ; cin.clear(); // . cin.ignore(INT_MAX); // . return 0; } } return 0; }

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как читает поток ввода cin ?
Спасибо большое, разобрался. Возникли новые вопросы: 1) как читает поток ввода оператор cin .

Как очистить поток ввода
cout << "Введите ряд целых чисел произвольной длины\n"; vector<int> vecint; int sum = 0; for.

Как очистить поток ввода?
std::istringstream iss(s1); idd>>a; iss.clear();; s1=s3; iss>>b надо чтоб s3 в b записалось.

Очистить поток std::stringstream
Вызываю функцию и в ней в поток инициализирую строку lеftPPF, далее вызываю повторно функцию и.

Она кричала хватит
Регистрация: 21.05.2019
Сообщений: 112

Используй после проверки условия

Добавлено через 3 секунды
Пардон, не прочитал внимательно. Нужно прервать цикл используй оператор break.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Как узнать, что есть данные для ввода, которые можно забрать std::cin
Всем здравствуйте! У меня есть параллельный поток, в котором нужно собирать данные с помощью.

Поток ввода cin
Привет. Я только начинаю учить C++, так что не смейтесь если проблема примитивная, но всё равно.

Поток ввода cin
vector<string> str; for (string s; cin >> s && !s.empty(); str.push_back(s)); // . for (auto.

Пропускает поток ввода cin
Решал задачку из книжки Страуструпа. В общей сложности решил. Но столкнулся с проблемой, после.

Поток ввода cin и его очистка(?)
Есть необходимость заполнять поля члены класса в консоли через ввод. Есть следующий отдельный.

Поток ввода cin работает сам по себе
Привет 🙂 Написал программу, забыл поставить после условия строку для ввода символов cin. Но он.

Что такое буфер ввода/вывода?

Объясните простым языком что такое буфер ввода или вывода, и зачем его очищать, и в каком случае его нужно очищать. В гугле ничего непонятно.

  • Вопрос задан более двух лет назад
  • 3175 просмотров

Комментировать
Решения вопроса 1

Anton3

Для ввода-вывода в консоль или файл программа делает системные вызовы чтения или записи. Не вдаваясь в подробности, скажу, что они дорогие. Если ты читаешь по одному символу из std::cin , то это будет работать жутко медленно.

Что происходит на практике: происходит один системный вызов, cin читает в свой внутренний буфер сразу, скажем, 4096 байт, и потом отдаёт тебе из буфера по одному символу, которые ты у него запрашиваешь. Нетрудно заметить, что работать это будет (в моём примере) где-то в 4096 раз быстрее.

Зачем очищать. Пока ты не сделал flush , то, что ты вывел в поток, находится в буфере. cout ждёт, пока ты докинешь ему ещё байтиков, чтобы вывести всё потом большим куском. Если же ты хочешь, чтобы вывод произошёл прямо сейчас, то нужен flush .

click fraud protection

Игнорировать или удалить одну или несколько букв из входного буфера с помощью метода cin.ignore(). Возможно, нам нужно удалить нежелательный буфер, чтобы следующие данные сохранялись в предполагаемом контейнере, а не в кеше предыдущей переменной. Например, мы должны предоставить массив символов или строку после ввода команды cin. В результате мы должны очистить входной буфер; иначе буфер предыдущей переменной был бы занят. Поскольку в кеше предыдущего элемента недостаточно места для хранения свежих данных, нажатие кнопки «Ввод» сразу после начального ввода игнорирует следующий ввод контейнера. Начнем с примеров работы функции cin.ignore() с запуском новых C++ файлов через терминальную оболочку. Файл должен быть создан с помощью сенсорной инструкции и имени файла. До сих пор для открытия файла для редактирования использовался редактор «nano» Ubuntu.

Пример 01:

При применении команды nano файл ignore.cc будет открыт в редакторе. Пришло время начать наш первый пример. Во-первых, мы рассмотрим код C++ без использования функции cin.ignore(). Итак, мы начали с двух библиотек заголовков, то есть вектора и iostream. Пространство имен используется после этого. Функция main() запускается с объявления целочисленной переменной «num» и массива символьных типов «Str» размером 100, используемого для хранения строкового значения. Оператор cout просит пользователя добавить одно целое и одно строковое значение. Оператор cin используется для помещения целочисленного значения в переменную «num», а cin.getline() используется для получения значений строкового типа, введенных пользователем, для сохранения их в переменной «Str» до 100 символов. Следующий оператор cout используется для вывода целочисленного и строкового значения, введенного пользователем в оболочке.

с использованием пространство имен станд. ;

син . получить линию ( ул, 100 ) ; // берём строку

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *