Поделиться через


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

См. также

Потоковый ввод-вывод
fclose, _fcloseall
_flushall
setvbuf