fflush
Функция 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.
Требования
| Функция | Обязательный заголовок |
|---|---|
| fflush |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// 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 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; >
User selected 5
Использование функции flush
У basic_ostream есть буфер. Данные выливаются из него не все время, а порциями, по мере наполнения того самого буфера. Чтобы убедиться, что поток отдал все и ничего не оставил в буфере, его принутительно «сливают» раньше срока ( flush ).
system пишет в stdout и stderr , потому, если вы тоже что-то туда пишите своим потоком, нужно убедиться, что в буфере ничего не застряло перед вызовом system .
Отслеживать
ответ дан 19 авг 2016 в 15:04
8,656 1 1 золотой знак 16 16 серебряных знаков 32 32 бронзовых знака
system ничего не пишет. Могут писать команды, которые вызываются через system .
19 авг 2016 в 15:15
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
int fflush(FILE *stream)
Если stream связан с файлом, открытым для записи, то вызов fflush() приводит к физической записи содержимого буфера в файл. Если же stream указывает на вводимый файл, то очищается входной буфер. В обоих случаях файл остается открытым.
Возврат 0 означает успех, а возврат ненулевой величины указывает на наличие ошибки по записи. Очистка всех буферов производится автоматически при нормальном завершении программы или при заполнении буферов. Закрытие файла также приводит к очистке буферов.
Следующий фрагмент кода вызывает очистку буферов после каждой операции записи.
/*
Предполагается, что fp связан с файлом для вывода
*/
.
fwrite ( buf , sizeof ( data_type ) , 1 , fp ) ;
fflush ( fp ) ;
.
Flush c что это
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.
Модераторы: ElcnU
‘> Скажите,что такое flush
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
Сообщ. #1 , 07.09.03, 11:51
Unregistered
Тут у меня такая функция затесалась(Бегущей строки),а «flush» я ещё не изучал ,да и «\r» тоже.
Что это такое и где искать сведения.Заранее благодарю
Сообщ. #2 , 07.09.03, 13:06
Full Member
Рейтинг (т): 6
‘\r’ это перевод каретки. (толи 0xA, толи 0xD). Еще досовский артефакт.
А flush это манипулятор потока. В конечном счете вызывает
virtual int sync();
The protected virtual member function endeavors to synchronize the controlled streams with any associated external streams. Typically, this involves writing out any elements between the beginning and next pointers for the output buffer. It does not involve putting back any elements between the next and end pointers for the input buffer. If the function cannot succeed, it returns -1. The default behavior is to return zero.
Искать нужно в MSDN (istream, ostream, cin, cout, cerr, clog и иже с ними). Если разберешся в этой _хреново_ (или у меня мозги кривые?) составленной документации (я имею ввиду именно по потокам) — медаль тебе.