fflush
Записывает содержимое потока на диск.
Синтаксис
int fflush(
FILE *stream
);
Параметры
stream
Указатель на структуру FILE
.
Возвращаемое значение
Функция fflush
возвращает 0, если содержимое буфера было успешно записано на диск. Кроме того, значение 0 также возвращается в случаях, когда указанный поток не имеет буфера или открыт только для чтения. Возвращаемое значение EOF
указывает на ошибку.
Примечание.
Если функция fflush
возвращает EOF
, возможна потеря данных из-за ошибки записи. При настройке обработчика критической ошибки лучше всего отключить буферизацию с помощью функции setvbuf
или использовать процедуры низкоуровневого ввода-вывода, такие как _open
, _close
и _write
, вместо функций ввода-вывода потока.
Замечания
Функция fflush
записывает на диск поток stream
. Если поток был открыт в режиме записи или был открыт в режиме обновления, а последняя операция была записью, fflush
записывает содержимое буфера потока в базовый файл или устройство, а буфер удаляется. Если поток был открыт в режиме чтения или не имеет буфера, вызов функции fflush
не дает никаких результатов, и содержимое буфера сохраняется. Вызов функции fflush
отменяет результат любого предыдущего вызова функции ungetc
для потока. После вызова поток остается открытым.
Если stream
имеет значение NULL
, поведение будет таким же, как при вызове функции fflush
для каждого открытого потока. Выполняется запись на диск всех потоков, открытых в режиме записи, а также всех потоков в режиме обновления, для которых последней была выполнена операция записи. Вызов не влияет на другие потоки.
Эти буферы обычно обслуживаются операционной системой, которая автоматически определяет оптимальное время записи данных на диск: при заполнении буфера, при закрытии потока или при нормальном завершении программы без закрытия потоков. Предусмотренная в библиотеке времени выполнения возможность фиксации на диск позволяет обеспечить запись критически важных данных непосредственно на диск, а не в буферы операционной системы. Без перезаписи существующей программы эту функцию можно включить, связав файлы объектов программы с COMMODE.OBJ
. В создаваемом исполняемом файле вызовы функции _flushall
записывают содержимое всех буферов на диск. Затрагиваются только _flushall
и fflush
затрагиваются COMMODE.OBJ
.
Сведения об управлении функцией фиксации на диск см. в разделе "Потоковые операции ввода-вывода" fopen
и _fdopen
.
Функция блокирует вызывающий поток, поэтому она потокобезопасна. Сведения о неблокирующей версии см. в описании функции _fflush_nolock
.
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.
Требования
Function | Обязательный заголовок |
---|---|
fflush |
<stdio.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// crt_fflush.c
// Compile with: cl /W4 crt_fflush.c
// This sample gets a number from the user, then writes it to a file.
// It ensures the write isn't lost on crash by calling fflush.
#include <stdio.h>
int * crash_the_program = 0;
int main(void)
{
FILE * my_file;
errno_t err = fopen_s(&my_file, "myfile.txt", "w");
if (my_file && !err)
{
printf("Write a number: ");
int my_number = 0;
scanf_s("%d", &my_number);
fprintf(my_file, "User selected %d\n", my_number);
// Write data to a file immediately instead of buffering.
fflush(my_file);
if (my_number == 5)
{
// Without using fflush, no data was written to the file
// prior to the crash, so the data is lost.
*crash_the_program = 5;
}
// Normally, fflush is not needed as closing the file will write the buffer.
// Note that files are automatically closed and flushed during normal termination.
fclose(my_file);
}
return 0;
}
5
User selected 5