Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
#1

Очистить поток - C++

28.08.2013, 17:05. Просмотров 1004. Ответов 9
Метки нет (Все метки)

Хотел с помощью куска кода (см.ниже) очистить буфер связанный с потоком cin. Но выражение в скобках по какой-то причине не изменяется?

C++
1
while(cin.rdbuf()->in_avail() != 0) cin.get();
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2013, 17:05     Очистить поток
Посмотрите здесь:

C++ Очистить экран
C++ Очистить поток от EOF
Очистить файл C++
Очистить текстовый файл C++
Очистить файл C++
C++ Скопировать поток в поток
C++ Как очистить cin?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 17:09     Очистить поток #2
C++
1
cin.ignore(cin.rdbuf()->in_avail());
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
28.08.2013, 17:29  [ТС]     Очистить поток #3
Цитата Сообщение от alsav22 Посмотреть сообщение
cin.ignore(cin.rdbuf()->in_avail());
Вы могли бы поподробнее рассказать что тут происходит?
Если я правильно понимаю при вводе с клавиатуры ввода сначала сохраняется в некоторый буфер связанный с потоком cin. Затем из этого буфера читается какое-то количество символов. Далее, при следующем вводе сначала считываются символы из буфера (если они там есть), а потом опять процесс повторяется. Так как я понял, строка: cin.rdbuf()->in_availe() даёт число символов в буфере на текущий момент. Значит при каждом вводе из буфера это значение должно уменьшаться?

Теперь вопросы:
1) Верно ли, всё чтол написано выше?
2) Если верно, то почему значение этой функции не уменьшается?
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 17:36     Очистить поток #4
Цитата Сообщение от bgm123 Посмотреть сообщение
поподробнее рассказать что тут происходит?
http://cppstudy.wordpress.com/2009/0...in-get-and-co/
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 17:42     Очистить поток #5
C++
1
2
3
4
5
6
7
8
9
10
char ch;
cin >> ch;
int i = 0;
    
while(cin.rdbuf() ->in_avail() != 0)
{
     cin.get();
     ++i;
}
cout << "i = " << i << endl;
Миниатюры
Очистить поток  
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
28.08.2013, 17:48     Очистить поток #6
Цитата Сообщение от bgm123 Посмотреть сообщение
Вы могли бы поподробнее рассказать что тут происходит?
Фукнция ignore()игнорирует количество символов которое мы ей передаем в качестве параметров, пропускает. Можно ей задать вторым параметром какой нить символ, если он встретится в потоке то функция до этого символа пропуст, например если в потоке 200 символом и мы вызовем cin.ignore(200,' ') и десятый символ например пробел, то она пропустить 10 символов. Следующий символ в потоке будет тот который идет после пробела.
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
28.08.2013, 17:57  [ТС]     Очистить поток #7
Всё что написано выше я понимаю. Дело в другом. Ниже приведено 2 кода. Один не работает и причины не понятны.

Работает:
C++
1
2
3
4
5
6
7
char ch[2];
 
    cin >> ch[0];
    while((i = cin.rdbuf()->in_avail()) != 0) {
        cin.get();
        cout << "i: " << i << endl;
    }
не работает: здесь значение i всегда постоянно. Почему так?
C++
1
2
3
4
5
6
7
char ch[2];
 
    cin.getline(ch, 2);
    while((i = cin.rdbuf()->in_avail()) != 0) {
        cin.get();
        cout << "i: " << i << endl;
    }
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 17:58     Очистить поток #8
Цитата Сообщение от bgm123 Посмотреть сообщение
Почему так?
Потому что в потоке ничего не осталось.
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
28.08.2013, 18:02  [ТС]     Очистить поток #9
Вы сначала скомпилируйте и введите: 1234567890 и посмотрите что получится?

Добавлено через 1 минуту
Там i вообще не меняется, получается бесконечный цикл. Но если бы в потоке ничего не было мы бы дажы в цикло то и не вошли!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2013, 18:09     Очистить поток
Еще ссылки по теме:

Как очистить входной поток от '\n'? C++
C++ Как очистить ostringstream?
C++ Как очистить поток ввода?
C++ Очистить стэк
C++ Очистить поток std::stringstream

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 18:09     Очистить поток #10
Цитата Сообщение от bgm123 Посмотреть сообщение
Вы сначала скомпилируйте и введите: 1234567890 и посмотрите что получится?
Читайте про функцию getline(): что происходит, когда вводится больше, чем второй параметр - 1.

Добавлено через 5 минут
И когда задаёте такие вопросы:
Цитата Сообщение от bgm123 Посмотреть сообщение
не работает: здесь значение i всегда постоянно. Почему так?
, то пишите, что вводите, ясновидящих тут нет.
Yandex
Объявления
28.08.2013, 18:09     Очистить поток
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru