Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / В каких случаях может возникнуть необходимость в использовании fflush? / 8 сообщений из 8, страница 1 из 1
16.12.2013, 10:28
    #38501823
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В каких случаях может возникнуть необходимость в использовании fflush?
Доброго времени суток.

Функция
Код: plaintext
1.
2.
#include <stdio.h>
int fclose(FILE* stream)

автоматически дозаписывает в поток информацию из буфера, в случае её наличия. Т.о. нет необходимости перед закрытием потока вызывать для него функцию
Код: plaintext
1.
2.
#include <stdio.h>
int fflush(FILE* stream)

В связи с этим возник вопрос: в каких случаях нужно использовать функцию fflush? Исходя из того, что указанная функция определена в стандарте C89, я полагаю, что она для каких-то ситуаций всё же нужна. Поиском по www.stackoverflow.com нашёл это . В обозначенном тексте приводится цитата:
C standardint fflush(FILE *ostream);

ostream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.

Насколько я её понял, то в том случае, если на момент вызова fflush буфер не содержит данных, то поведение функции не определено... Ниже автор ответа пишет о том, что функцию fflush вообще не следует использовать. Если так, то почему данная функция присутствует в стандарте?

Спасибо.
...
Рейтинг: 0 / 0
16.12.2013, 11:41
    #38501907
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В каких случаях может возникнуть необходимость в использовании fflush?
Compositum,

Т.о. нет необходимости перед закрытием потока вызывать для него функцию


да, перед закрытием нет такой необходимости.

но не перед закрытием она может появиться. все потоки, в том числе сетевые, буферизируются. Соответственно, дослать кусок данных в буфере нужно делать flush.
...
Рейтинг: 0 / 0
16.12.2013, 11:44
    #38501911
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В каких случаях может возникнуть необходимость в использовании fflush?
Насчёт сей не скажу. А в других языках если вместо FileStream используется memory-stream
то для получения его согласованного byte[]-представления нужно дёрнуть flush
а потом только получить массив байтов. Close() в явном виде нельзя вызывать т.к. это очистит
byte-буфер.

Flush также полезно дёргать после вывода важного события записи в лог-файл. В противном
случае читающий этот файл может не сразу увидеть это событие.
...
Рейтинг: 0 / 0
16.12.2013, 12:04
    #38501936
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В каких случаях может возникнуть необходимость в использовании fflush?
А как быть с "неопределённым поведением" (обозначенным мною выше)? Например, вы вызываете fflush, а буфер в это время пустой... Чем чревато такое поведение в данном случае, в чём оно может выражаться?
...
Рейтинг: 0 / 0
16.12.2013, 12:42
    #38502010
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В каких случаях может возникнуть необходимость в использовании fflush?
CompositumА как быть с "неопределённым поведением" (обозначенным мною выше)? Например, вы вызываете fflush, а буфер в это время пустой... Чем чревато такое поведение в данном случае, в чём оно может выражаться?

Ничем, если буфер пуст, то ничего и не произойдёт.
...
Рейтинг: 0 / 0
16.12.2013, 12:45
    #38502013
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В каких случаях может возникнуть необходимость в использовании fflush?
http://www.cplusplus.com/reference/cstdio/fflush/ function
<cstdio>
fflush

int fflush ( FILE * stream );

Flush stream
If the given stream was open for writing (or if it was open for updating and the last i/o operation was an output operation) any unwritten data in its output buffer is written to the file.

If stream is a null pointer, all such streams are flushed.

In all other cases, the behavior depends on the specific library implementation. In some implementations, flushing a stream open for reading causes its input buffer to be cleared (but this is not portable expected behavior).

The stream remains open after this call.

When a file is closed, either because of a call to fclose or because the program terminates, all the buffers associated with it are automatically flushed.
...
Рейтинг: 0 / 0
16.12.2013, 12:51
    #38502024
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В каких случаях может возникнуть необходимость в использовании fflush?
Compositum
В связи с этим возник вопрос: в каких случаях нужно использовать функцию fflush? Исходя из того, что указанная функция определена в стандарте C89, я полагаю, что она для каких-то ситуаций всё же нужна. Поиском по www.stackoverflow.com нашёл это.


В том топике говорится о применении fflush к ВХОДНОМУ файлу.
Выше я дал ссылку на описание функции, где однозначно говорится, что это непереносимо. Т.е. так делать нельзя.
Возможно, в топике со stack профессор просто знал точно, на какой реализации будут работать его студенты и
рекомендовал им делать так очистку ввода. Иначе её в общем непонятно как делать и на сколько я знаю переносимого
способа нет. Это я к тому, что профессор мог быть и не так уж неправ.
...
Рейтинг: 0 / 0
16.12.2013, 12:58
    #38502036
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В каких случаях может возникнуть необходимость в использовании fflush?
Спасибо!
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / В каких случаях может возникнуть необходимость в использовании fflush? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]