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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.94
warobushek
2 / 2 / 0
Регистрация: 08.03.2008
Сообщений: 82
#1

Опять про fflush, уже stdout - C++

31.08.2008, 05:46. Просмотров 4504. Ответов 9
Метки нет (Все метки)

Уважаемые профессионалы. В книге Хэзфилд, Кирби " Искусство программирования на языке Си. Фундаментальные алгоритмы.... " на 58 стр. увидел текст ниже. Скажите, кто прав? Он или авторы следующих ресурсов : http://c-faq.com/stdio/stdinflush.html http://c-faq.com/stdio/stdinflush2.html .
Подавление буферов ввода
Ниже демонстроруется обычно применяемая методика освобождения от нежелательных символов во входном потоке:
Код
printf("Введите возраст");
scanf("%d", &age);     /*получение возраста*/ 
printf("Введите размер обуви:");
fflush(stdin);
scanf("%d", &shoesize);
Почитаем, что стандарт говорит об этом фрагменте:
Код
#include <stdio.h>
int fflush(FILE* stream);
Из раздела 7.19.5.2: "[#2] Если stream указывает на выходной поток
или на модификацию потока, в котором последняя не было операцией ввода,
функция fflush удаляет любые непечатаемые данные, для которых поток доставлен
в хост-среду для записи в файл; в противном случае поведение неопределено".


Если вы хотите избавиться от случайных символов между обращениями к scanf, можете сделать это следующим образом:
Код
 printf("Введите возраст:");
fflush(stdout);
scanf("%d",&age);
printf("Введите размер обуви:");
fflush(stdout);
scanf(" %d", &shoesize); [color=red] /*обратите внимание на лидирующий пробел*/ [/color]
(Как вы видите, я принял возможность продемонстрировать, что вы можете переносимо собрать ввод на той же строке, что и предыдущий вывод, разумно используя функцию fflush() )
Скажите, кто прав? Что дает этот "волшебный" пробел в его примере?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2008, 05:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Опять про fflush, уже stdout (C++):

Опять про cin.getline и невызов - C++
я знаю, что вопрос много раз поднимался, но везде ссылки или описания типа делай так и все - это я читал... Вот фрагмент кода: ...

Опять про реализацию класса в отдельном файле - C++
Допустимо ли следующее? есть проект в Visual Studio 2010. в нем следующие файлы: main.cpp - собссно программа MyClass.h -...

fflush(stdin) - C++
В одной из ранее открытых тем, было сказано, что fllush(stdin) лучше не использовать. Чем можно заменить эту функцию?

std::fflush(stdin); - C++
std::fflush(stdin); что делает эта функция?

Fflush(stdin) по-разному работают в unix и windows - C++
Собственно, код: #include &lt;iostream&gt; #include &lt;cstdio&gt; using namespace std; int main() { char word1, word2; ...

Неожиданное поведение fflush(), неправильная работа функции - C++
Никак не пойму почему код не хочет работать последовательно, так, как я ему указал.Что не так я делаю с fflush? Функция запрашивает лишь...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Vourhey
Почетный модератор
6482 / 2257 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
31.08.2008, 10:58 #2
Можно, вообще, узнать, что это за методика? В чем отличие, если я не скажу fflush?
0
ABTOP
36 / 36 / 2
Регистрация: 09.06.2008
Сообщений: 324
31.08.2008, 13:56 #3
Я не видел что бы где нибудь в теории или MSDN было наприсанно про этот "волшебный" пробел в разных вводах, как я понимаю он служит разделителем... дело в том что

Код
scanf("%d%d", &a, &b);
редко, но возникают ошибки ввода... вот почему используют пробел...

Код
scanf("%d %d", &a, &b);
он являеться знаком знаком по которому компилятор разделяет вводимые значения... и видимо поклонники этого пробела решили перенести его при вводе в несколько строк... Один придумал и все пользуються... так что оба варианта правильны и надёжны... а fflush() тоже не надо, это просто, сново таки, один из обьектов осторожности...
0
Vourhey
Почетный модератор
6482 / 2257 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
31.08.2008, 14:45 #4
Вот я не понял насчет того, что fflush удаляет какие-то там символы. Это fpurge делает...
0
warobushek
2 / 2 / 0
Регистрация: 08.03.2008
Сообщений: 82
31.08.2008, 16:04  [ТС] #5
fpurge на любой платформе есть?
0
Vourhey
Почетный модератор
6482 / 2257 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
31.08.2008, 16:07 #6
Нет. На фряхе. На линухе - __fpurge. На винде не в курсе...
0
ABTOP
36 / 36 / 2
Регистрация: 09.06.2008
Сообщений: 324
31.08.2008, 19:51 #7
fpurge() - Освобождает канал, не закрывая файла, и освобождает память,
занятую под дескриптор. Если файл был открыт на вывод, он теряется.

Если поток stream связан с файлом, открытым для записи, то при обращении к функции fflush() в этот файл будет физически записано содержимое выходного буфера. При этом файл остается открытым. Нулевое значение, возвращаемое функцией, свидетельствует о ее успешном выполнении, а значение EOF — о возникновении ошибки при записи.

разницы практически нет... Просто сведения про fpurge(), я нашол в книге по С++,а fflush() по С... может разныца в этом
0
Vourhey
Почетный модератор
6482 / 2257 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
31.08.2008, 22:46 #8
Это как это теряется? Кто теряется? Магия какая-то. Фигасе разницы нет!
Одна функция очищает буфера, которые еще не успели записаться. То есть данные незаписанные пропадают.
Другая наоборот форсирует запись.
Они, фактически, противоположны друг другу.

P. S. Вопрос-то в том, как это все связать с тем, что в начале темы. Для чего там флашат стрим...что эта функция должна удалять...
0
ABTOP
36 / 36 / 2
Регистрация: 09.06.2008
Сообщений: 324
01.09.2008, 19:38 #9
я думаю что fflush() очишает что-то от предыдущего scanf()... А что именно хз... И насчёт теряеться... теория списанна с учебника...
0
Vourhey
Почетный модератор
6482 / 2257 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
02.09.2008, 13:53 #10
Эм, он ничего не очищает. просто последующий scanf захватит данные, которые через пробел идут. Причем, захватит он и со scanf и без него...

P. S. Да я верю. Просто я на практике применял еще. Я не понял, что там теряется, просто С дескриптором файла ничего не происходит. Только с данными.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2008, 13:53
Привет! Вот еще темы с ответами:

Программа пропускает ввод данных несмотря на fflush - C++
Доброго времени суток. Возникла проблема - когда я в первый раз в цикле ввожу текст посимвольно с помощью getchar, то все нормально. Однако...

Перенаправление потока stdout - C++
Пишу программу с использованием библиотеки SDL.h. Дело в том, что в ней переопределена функция main и стандартные потоки завязанные на...

stdin, stdout, stderror - C++
Эти три файловых дискриптора, получаемые программами при запуске они указывают на реальные файлы, который файловая система создает? Когда я...

Текстовой файл с уже введенным текстом зашифровать и вывести уже зашифрованный - C++
Здравствуйте.Задание -шифр Виженера. Вроде код написал,но есть ошибки.Задание заключается в том,чтобы текстовой файл с уже введенным...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.09.2008, 13:53
Ответ Создать тему
Опции темы

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