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

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

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

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

31.08.2008, 05:46. Просмотров 4461. Ответов 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() )
Скажите, кто прав? Что дает этот "волшебный" пробел в его примере?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
31.08.2008, 10:58     Опять про fflush, уже stdout #2
Можно, вообще, узнать, что это за методика? В чем отличие, если я не скажу fflush?
ABTOP
36 / 36 / 2
Регистрация: 09.06.2008
Сообщений: 324
31.08.2008, 13:56     Опять про fflush, уже stdout #3
Я не видел что бы где нибудь в теории или MSDN было наприсанно про этот "волшебный" пробел в разных вводах, как я понимаю он служит разделителем... дело в том что

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

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

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

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

P. S. Вопрос-то в том, как это все связать с тем, что в начале темы. Для чего там флашат стрим...что эта функция должна удалять...
ABTOP
36 / 36 / 2
Регистрация: 09.06.2008
Сообщений: 324
01.09.2008, 19:38     Опять про fflush, уже stdout #9
я думаю что fflush() очишает что-то от предыдущего scanf()... А что именно хз... И насчёт теряеться... теория списанна с учебника...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2008, 13:53     Опять про fflush, уже stdout
Еще ссылки по теме:
C++ Перенаправление потока stdout
stdin, stdout, stderror C++
Перехват stdout графического приложения C++
C++ Текстовой файл с уже введенным текстом зашифровать и вывести уже зашифрованный
Ошибка при создании класса библиотека: "'fflush' was not declared in this scope" C++

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

Или воспользуйтесь поиском по форуму:
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
02.09.2008, 13:53     Опять про fflush, уже stdout #10
Эм, он ничего не очищает. просто последующий scanf захватит данные, которые через пробел идут. Причем, захватит он и со scanf и без него...

P. S. Да я верю. Просто я на практике применял еще. Я не понял, что там теряется, просто С дескриптором файла ничего не происходит. Только с данными.
Yandex
Объявления
02.09.2008, 13:53     Опять про fflush, уже stdout
Ответ Создать тему
Опции темы

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