fflush stdin в си

All | _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

fflush – проталкивание накопленных данных в потока данных.

#include
int fflush (FILE *stream);

stream – указатель на управляющую таблицу потока данных.

0 – при успешном завершении работы функции.

EOF (обычно -1) – в случаи ошибки.

Функция fflush сбрасывает в связанный с потоком данных файл данные, находящиеся в буфере.

Если аргумент stream имеет значения:

— NULL, то сбрасываются буферы всех открытых в данный момент потоков данных;

— stdout, то сбрасывается буфер стандартного потока вывода.

В примере отсчитывается время в секундах с момента запуска программы. Отсчитываемое время выводится на консоль. Чтобы время выводилось сразу же в момент печати, используется функция fflush.

Отображение в консоле через 5 секунд после запуска программы:

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

Можем ли мы использовать его для входного потока, как стандартный ввод?
В соответствии со стандартом C поведение fflush (stdin) не определено. Однако некоторые компиляторы, такие как Microsoft visual studio, позволяют это разрешать. Как это используется в этих компиляторах? Принимая входную строку с пробелами, буфер не очищается для следующего ввода и рассматривает предыдущий ввод для того же самого. Для решения этой проблемы fflush (stdin) есть. используется для очистки потока / буфера.

ссылка на сайт
brightness_4
код

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

ссылка на сайт
brightness_4
код

Хорошо ли использовать fflush (stdin)?

Хотя использование «fflush (stdin)» после оператора «scanf ()» также очищает входной буфер в некоторых компиляторах, его не рекомендуется использовать, так как это неопределяемое поведение в соответствии со стандартом языка. В C и C ++ у нас есть разные методы для очистки буфера, обсуждаемого в этом посте .

Эта статья предоставлена Сахилом Чхаброй . Если вы хотите GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

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

Я очень новичок в программировании на C, и я пытаюсь понять, как действительно работает fflush(stdin) .

В следующем примере fflush(stdin) очищает весь буфер или очищает все, что было введено после третьего элемента? Я имею в виду, что пользователь вводит номер счета, пробел, имя, пробел, баланс. Это правда, что с этого момента все, что вводит пользователь, будет сброшено с помощью fflush(stdin) ? и stdin не будет пустым.

Почему я говорю, что это потому, что он входит в цикл while и начинает писать в текстовый файл.

Мой второй вопрос: может ли Ctrl-Z OS перестать запрашивать у пользователя ввод ввода?

Ответ на этот вопрос заключается в том, что fflush(stream) формально определен для выходных потоков, поэтому fflush(stdout) в порядке, но fflush(stdin) нет.

Цель fflush(stream) — заставить операционную систему сбросить все буферы в основной файл. Для примера законного использования у учеников часто возникают такие проблемы, как «мое приглашение не появляется!» если они делают что-то вроде:

Однако они находят, что это работает отлично:

Конечно, им не нужна новая строка после их подсказки, поэтому у них есть небольшая проблема.

Причиной этого является то, что вывод на stdout буферизуется ОС, а поведение по умолчанию (часто) — только для фактической записи вывода на терминал при возникновении новой строки. Добавление fflush(stdout) после printf() решает проблему:

Теперь, по аналогии, люди часто думают, что fflush(stdin) должен отказаться от любого неиспользуемого ввода, но если вы подумаете об этом немного, что не имеет большого смысла. Что означает «сбросить» входной буфер? Где он «покраснел»? Если вы очистите выходной буфер, вывод будет отправлен в базовый файл или терминал, где он все равно закончится, но где будет вводиться «в конечном итоге все равно»? Нет никакого способа узнать! Каким должно быть поведение, если данные входного потока поступают из файла или трубы или сокета? Для входных потоков не совсем ясно, каково поведение fflush() , но во всех случаях это очень ясно для выходных потоков. Следовательно, fflush() определяется только для выходных потоков.

Причина, по которой ошибочное использование fflush(stdin) стала обычным явлением, заключается в том, что многие годы назад несколько операционных систем действительно реализовали схему, в которой она работала так, как ожидали многие люди, отбрасывая неиспользуемые данные. Хорошим примером является Microsoft DOS. Удивительно, но современные версии Linux также реализуют fflush() для входных потоков.

Правильная вещь, связанная с «лишним» нежелательным вводом терминала, — это просто прочитать ее и ничего не делать с ней. Это почти так же просто, как вызов fflush(stdin) , работает повсюду и не полагается на формально поведение undefined.

В стандарте C говорится:

Если поток указывает на выходной поток или поток обновлений, в котором самая последняя операция не была введена, функция fflush приводит к тому, что любые неписанные данные для этого потока будут доставлены в среду хоста, чтобы записывается в файл; , поведение undefined.

POSIX говорит (также явно отклоняется от стандарта C):

Если поток указывает на выходной поток или поток обновлений, в котором последняя операция не была введена, fflush() приведет к тому, что в файл будут записаны любые неписанные данные для этого потока.

Для выходных потоков функция fflush() заставляет записывать все буферизованные данные в пользовательском пространстве для данного потока вывода или обновления через функцию записи, лежащую в основе потока. Для входных потоков fflush() отбрасывает любые буферизованные данные, которые были извлечены из основного файла, но не были использованы приложением. Открытый статус потока не изменяется.

Оцените статью