Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/37: Рейтинг темы: голосов - 37, средняя оценка - 4.73
2 / 2 / 1
Регистрация: 08.03.2008
Сообщений: 82
1

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

31.08.2008, 05:46. Просмотров 7108. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.08.2008, 05:46
Ответы с готовыми решениями:

Stdout записать в буфер и затем в stdout
Привет, подскажите начинающему как записать страницу загруженную с помощью curl в буфер а затем...

Опять про ПР... :/
Вот у меня опять назрел вопрос, который пытаюсь уже давно выяснить... Для примера возьмем сайт на...

опять про ПР
Если у меня 1 страничный сайт и с index.php идут 12 локальных линков на форум, фурум я не...

Опять же про сапу
Ув сео. Я купила на сапе примарно 150 тематических сылок, с ключевыми словами новости, и новости...

9
Почетный модератор
7336 / 2601 / 270
Регистрация: 29.07.2006
Сообщений: 13,588
31.08.2008, 10:58 2
Можно, вообще, узнать, что это за методика? В чем отличие, если я не скажу fflush?
0
36 / 36 / 4
Регистрация: 09.06.2008
Сообщений: 324
31.08.2008, 13:56 3
Я не видел что бы где нибудь в теории или MSDN было наприсанно про этот "волшебный" пробел в разных вводах, как я понимаю он служит разделителем... дело в том что

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

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

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

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

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

P. S. Да я верю. Просто я на практике применял еще. Я не понял, что там теряется, просто С дескриптором файла ничего не происходит. Только с данными.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2008, 13:53

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

Опять про таймеры
Пытаюсь запустить таймер в режиме fast pwm 14, так, чтобы при сравнении счетного регистра с OCR1A и...

Опять про массивы
Всем привет. Подружка попросила помочь ее сыну решить пару лабораторных по информатике на vba,...

опять про MenuStrip
Уважаемые знатоки, помогите! Нужно динамически создавать ComboBox и желательно Progress bar...

Опять про "склейку"
Здравствуйте. Поиском пользовался - информация разная, оттого и спрашиваю, просьба не ругать. Для...

Опять про шрифты
есть большая разница между количеством установленных шрифтов и доступными шрифтами в папке fonts...

Опять про саттелиты
контент -уникальный или не уникальный? что выбрать?


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

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

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