Существует три типа буферизации: нулевая буферизация (ее отсутствие),
буферизация блока и буферизация строки. Когда выводимые данные не
буферизируются, то информация незамедлительно оказывается на терминале
(или в файле назначения); когда производится буферизация блока, то
сохраняется большое количество символов (их блок), при строчной
буферизации все символы сохраняются в буфере до перевода строки. Функция
fflush(3)
принуждает закончить буферизацию блока раньше (см.
fclose(3)).
Обычно все файлы буферизуются блоком. При операции I/O над файлом
производится вызов
malloc(3),
затем принимается буфер. Если поток ссылается на терминал (как это делает
stdout),
то первый буферизируется построчно. Стандартный поток ошибок
stderr
по умолчанию никогда не буферизуется.
Функция
setvbuf
может быть использована над любым открытым потоком для
изменения типа буферизации. Параметр
mode
должен быть одним из трех следующих макросов:
_IONBF
(отключить буферизацию);
_IOLBF
(строчная буферизация);
_IOFBF
(блочная буферизация).
Аргумент
buf
должен указывать на буфер (кроме случаев, когда буферизация отключается)
размером, как минимум, равным
size
байтам; и этот буфер будет использоваться вместо текущего. Если аргумент
buf
равен
NULL,
то это отразится только на буферизации; при следующей операции считывания
или записи будет создан новый буфер.
Функция
setvbuf
может быть использована после открытия потока и до
выполнения над ним любых операций.
Следующие три вызова идентичны по сути вызову
setvbuf.
Функция
setbuf
в точности соответствует вызову
Функция
setbuffer
также аналогична ей, но размер буфера в данном случае определяется
вызовом, а не размером по умолчанию
BUFSIZ.
Функция
setlinebuf
полностью идентична вызову
setvbuf(stream, (char *)NULL, _IOLBF, 0);
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
Функция
setvbuf
возвращает 0 при нормальном завершении работы.
При ошибках она может возвратить любое значение,
но также она возвращает ненулевое значение, когда
mode
неверно или когда запрос некорректен. При ошибках
errno
может быть соответственно изменено.
Другие функции не возвращают никаких значений.
СООТВЕТСТВИЕ СТАНДАРТАМ
Функции
setbuf
и
setvbuf
соответствуют стандарту ANSI X3.159-1989 (``ANSI C'').
НАЙДЕННЫЕ ОШИБКИ
Функции
setbuffer
и
setlinebuf
не подходят к версиям BSD до 4.2BSD, и доступны в Linux
только с версии 4.5.21. В системах 4.2BSD and 4.3BSD
setbuf
по умолчанию всегда использует оптимальный размер буфера, и поэтому
этого вызова функции следует избегать.
Вы должны удостовериться, что
buf
и позиция, на которую он указывает, все еще существуют, в то время как
поток
закрыт, что обычно случается при закрытии программы.
Например, следующее будет неправильным: