Перейти к содержимому

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

  • автор:

Как мне смыть буфер cin?

Я бы предпочел ограничения размера C++ вместо версий C:

// Ignore to the end of Stream std::cin.ignore(std::numeric_limits::max()) // Ignore to the end of line std::cin.ignore(std::numeric_limits::max(), '\n') 

Поделиться 02 ноября 2008 в 18:34

std::cin.ignore(INT_MAX); 

Это будет читать и игнорировать все до EOF . (Вы также можете добавить второй аргумент, который является символом для чтения до (например, ‘\n’ , чтобы игнорировать одну строку).

Также: вам, вероятно, нужно сделать: std::cin.clear(); перед этим, чтобы сбросить состояние потока.

Поделиться 02 ноября 2008 в 17:37

cin.clear(); fflush(stdin); 

Это было единственное, что сработало для меня при чтении из консоли. В каждом другом случае оно либо читалось бесконечно из-за отсутствия \n, либо что-то оставалось в буфере.

РЕДАКТИРОВАНИЕ: Я обнаружил, что предыдущее решение ухудшило ситуацию. Однако, вот что работает:

cin.getline(temp, STRLEN); if (cin.fail()) < cin.clear(); cin.ignore(numeric_limits::max(), '\n'); > 

Поделиться 19 мая 2014 в 18:47

Я нашел два решения для этого.

Первое и самое простое — использовать std::getline() , например:

std::getline(std::cin, yourString); 

. это отбросит поток ввода, когда он дойдет до новой строки. Подробнее об этой функции здесь.

Другой вариант, который напрямую отбрасывает поток, это это.

#include // Possibly some other code here cin.clear(); cin.ignore(numeric_limits::max(), '\n'); 

Поделиться 29 декабря 2015 в 20:50

int i; cout > i; leaves '\n' among possible other junk in the buffer. // '\n' also happens to be the default delim character for getline() below. cin >> i; if (cin.fail()) < cout cin.clear(); cin.ignore(INT_MAX,'\n'); cout  

Поделиться 09 октября 2009 в 09:26

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

Поделиться 11 февраля 2009 в 20:30

Еще одно возможное (ручное) решение -

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

Я не могу использовать fflush или cin.flush() с CLion, поэтому это было удобно.

Поделиться 07 августа 2015 в 08:15

cin.clear(); fflush(stdin); 

Есть пример, где cin.ignore просто не сокращает его, но я не могу об этом подумать на данный момент. Это было некоторое время назад, когда мне нужно было использовать его (с помощью Mingw).

Однако, fflush(stdin) является неопределенным поведением согласно стандарту. fflush() предназначен только для потоков вывода. fflush(stdin) работает только как ожидается в Windows (по крайней мере, с компиляторами GCC и MS) как расширение к стандарту C .

Таким образом, если вы используете его, ваш код не будет переносимым.

Поделиться 02 ноября 2008 в 18:55

Самый простой способ:

cin.seekg(0,ios::end); cin.clear(); 

Он просто позиционирует указатель cin в конце потока stdin, и cin.clear() очищает все флаги ошибок, такие как флаг EOF.

Поделиться 25 сентября 2017 в 17:45

Это сработало для меня. Я использовал цикл for с помощью getline().

cin.ignore() 

Поделиться 19 мая 2020 в 15:27

#include

а затем использовать функцию

__fpurge(stdin) 

Поделиться 08 ноября 2014 в 12:47

Следующее должно работать:

cin.flush(); 

На некоторых системах оно недоступно, и вы можете использовать:

cin.ignore(INT_MAX); 

Поделиться 02 ноября 2008 в 17:34

cin.get() , кажется, автоматически стирает его довольно странно (хотя, вероятно, не предпочтительно, так как это запутанно и, вероятно, темпераментально).

Поделиться 19 марта 2015 в 21:38

fflush(stdin) - Он используется для очистки памяти буфера ввода. Рекомендуется использовать перед написанием оператора scanf.

fflush(stdout) - Он используется для очистки памяти буфера вывода. Рекомендуется использовать перед оператором printf. Следующее должно работать:

cin.flush(); На некоторых системах он недоступен, и вы можете использовать:

cin.ignore(INT_MAX); И Windows, и Linux определяют поведение fflush() в потоке ввода и даже определяют его одинаково (чудо чуда). Стандарты POSIX, C и C++ для fflush() не определяют поведение, но ни один из них не мешает системе определить его. Если вы кодируете для максимальной переносимости, избегайте fflush(stdin); если вы кодируете для платформ, которые определяют поведение, используйте его - но помните, что не переносимый код не использует fflush(stdin). Код, привязанный к платформе Microsoft, может использовать его и он может работать как ожидается, но будьте осторожны с проблемами переносимости.

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

Всего лишь сбрасывает все флаги для потока, а мне нужно буфер потока очистить. В си была функция flushall(), только она не работает для потоков =(((

Re[4]: как очистить cin?

От: Аноним
Дата: 09.03.04 22:02
Оценка:

Здравствуйте, _chill, Вы писали:

_>Всего лишь сбрасывает все флаги для потока, а мне нужно буфер потока очистить. В си была функция flushall(), только она не работает для потоков =(((

basic_ostream::flush See Also basic_ostream Class | basic_ostream Members Flushes the buffer. basic_ostream& flush( ); Return Value A reference to the basic_ostream object. Remarks If rdbuf is not a null pointer, the function calls rdbuf->pubsync. If that returns -1, the function calls setstate(badbit). It returns *this. Example // basic_ostream_flush.cpp // compile with: /EHsc #include void main( ) < using namespace std; cout "test"; cout.flush(); >

Re[5]: как очистить cin?

От: Аноним
Дата: 09.03.04 22:11
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, _chill, Вы писали:

_>>Всего лишь сбрасывает все флаги для потока, а мне нужно буфер потока очистить. В си была функция flushall(), только она не работает для потоков =(((

А>basic_ostream::flush See Also basic_ostream Class | basic_ostream Members А>Flushes the buffer. А>basic_ostream& flush( ); А>Return Value А>A reference to the basic_ostream object. А>Remarks А>If rdbuf is not a null pointer, the function calls rdbuf->pubsync. If that returns -1, the function calls setstate(badbit). It returns *this. А>Example А>// basic_ostream_flush.cpp А>// compile with: /EHsc А>#include А>void main( ) А> < А>using namespace std; А> cout "test"; А> cout.flush(); А>> А>

сорри не глянул что там istream

Re: как очистить cin?

От: Шахтер
Дата: 10.03.04 02:03
Оценка:

Здравствуйте, _chill, Вы писали:

_>Подскажите, пожалуйста, как очистить буфер потока стандартного ввода — cin?

/* main.cpp */ #include using namespace std; /* main() */ int main() < int c=0; cout "c c o m"> В XXI век с CCore. 
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы

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

Пользователь

Регистрация: 05.11.2009

Сообщений: 41

Очистка буфера ввода консоли

При вводе в буфере консоли остаётся мусор - последняя введенная строка. fflush(stdin) не помогает очистить.
Программа эмуляция бд - ввожу новую запись пять строк и одно число. Потом пытаюсь редактировать и в первый ввод scanf или gets попадает то что вводил до этого. Вроде проблему решило fseek(stdin, 0, SEEK_END) но я не понимаю почему так происходит?

Очистка буфера ввода cin

Я только учу С++ и хочу сделать обработку неправильного введения пола друга. К примеру, пользователь вводит что-то кроме W и M и запрос на введение повторяется в цикле, что видно из кода. Также будет происходить, если пользователь введет много символов вместо одного. Но тут есть один момент. Дело в том, что так как тип переменной friend_sex char, то из потока ввода последовательность символов считывается посимвольно. Я написал abcd , допустим, но считалось сначала a , потом (если это в цикле, берется второй символ и происходит проверка, и так до конца). По сути, если написать abcMf , то на проверке четвертого символа цикл завершится, ибо проверка будет пройдена. Вопрос: Я хочу, чтобы при введение последовательности символов, считывался первый, а буфер ввода очищался от оставшихся. Посоветуйте, пожалуйста, функцию очистки буфера (cin.clear() не работает).

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

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