2013-04-23 4 views
9

У меня есть старый добрый файловый дескриптор C FILE под Windows, который используется потоком вывода для записи данных. Мой вопрос прост, и все же я не мог найти ответ:Когда FILE размывается?

Когда содержимое сбрасывается на диск, если я не вызываю fflush?

Поток постоянно получает данные, и кажется, что контент покраснел довольно часто, но каково правило его промывки?

+3

Довольно точно, что это зависит от ОС. – Phonon

+0

Кстати, в коде используется wxTextOutputStream, который использует wxFFileOutoutStream, который использует wxFFile. Но это только инкапсулирует структуру FILE, поэтому я думаю, что механизм fflush - это интересная вещь ... – anhoppe

+1

Если она буферизована, то она очищается после того, как буфер заполнен. И я не совсем понимаю, что вы подразумеваете под структурой FILE (fopen , fwrite, ....) –

ответ

13

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

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

(ISO/IEC 9899: 1999, глава 7.19.5.3 "fopen() функция", пункт 7. Не более новая версия стандарта под рукой, но AFAIK это не изменило.)

Что представляет собой «интерактивное устройство», определяется реализацией. (Глава 5.1.2.3 «Выполнение программы», п. 6.)

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

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

+0

Человек, это хороший ответ, спасибо – anhoppe

+1

@anhoppe: Я на самом деле * реализован * '', и * boy * вам лучше научиться читать мелкий шрифт, когда вы это делаете ... :-D – DevSolar

+0

+1 Кроме того, [стандарт C11] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) указывает, что 'BUFSIZ' должен быть _at наименьшим_ 256. –

 Смежные вопросы

  • Нет связанных вопросов^_^