Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

Очистить поток от EOF - C++
Как очистить вх. поток от символа конца строки? Вот например нужно мне считать два куска текста (с пробелами и переводами каретки) в два...

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

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

Как очистить входной поток от '\n'? - C++
Программа закрывается #include "stdafx.h" #include <iostream> #include "conio.h" #include "windows.h" using namespace::std; ...

Очистить поток из под try catch - C++
Как очистить поток из под try catch, чтобы после ошибки заново ввести? #include "stdafx.h" #include <iostream> #include...

Скопировать поток и добавить ошибки в поток - C++
Здорова господа! Есть задачка: "Скопируйте поток объектов типа Name_and_address и вставьте в него столько ошибок, сколько сколько...

9
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 17:09 #2
C++
1
cin.ignore(cin.rdbuf()->in_avail());
0
bgm123
40 / 40 / 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) Если верно, то почему значение этой функции не уменьшается?
0
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 17:36 #4
Цитата Сообщение от bgm123 Посмотреть сообщение
поподробнее рассказать что тут происходит?
http://cppstudy.wordpress.com/2009/03/27/cin-get-and-co/
0
alsav22
5435 / 4830 / 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;
0
Миниатюры
Очистить поток  
ninja2
814 / 188 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
28.08.2013, 17:48 #6
Цитата Сообщение от bgm123 Посмотреть сообщение
Вы могли бы поподробнее рассказать что тут происходит?
Фукнция ignore()игнорирует количество символов которое мы ей передаем в качестве параметров, пропускает. Можно ей задать вторым параметром какой нить символ, если он встретится в потоке то функция до этого символа пропуст, например если в потоке 200 символом и мы вызовем cin.ignore(200,' ') и десятый символ например пробел, то она пропустить 10 символов. Следующий символ в потоке будет тот который идет после пробела.
0
bgm123
40 / 40 / 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;
    }
0
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 17:58 #8
Цитата Сообщение от bgm123 Посмотреть сообщение
Почему так?
Потому что в потоке ничего не осталось.
0
bgm123
40 / 40 / 16
Регистрация: 29.01.2013
Сообщений: 277
28.08.2013, 18:02  [ТС] #9
Вы сначала скомпилируйте и введите: 1234567890 и посмотрите что получится?

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

Добавлено через 5 минут
И когда задаёте такие вопросы:
Цитата Сообщение от bgm123 Посмотреть сообщение
не работает: здесь значение i всегда постоянно. Почему так?
, то пишите, что вводите, ясновидящих тут нет.
0
28.08.2013, 18:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2013, 18:09
Привет! Вот еще темы с ответами:

Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции. - C++
Совсем не понял эту тему. Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде...

Скопировать поток в поток - C++
Есть ли возможность скопировать один поток в другой. Например int main() { ofstream (*P) = new ofstream; ofstream...

Очистить файл - C++
Здравствуйте Перед использованием нужно очистить файл..он 100% будет не пустой в данной ветке std::cout&lt;&lt;&quot;input new pass&quot;; ...

Очистить файл - C++
Как через класы потоков очистить открытый файл? 32 строка вроде ф-ция для очистки, но она не очищает файл. #include &lt;fstream&gt; #include...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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