Страница Справочника setbuf.3
SETBUF(3) Справочник библиотечных функций FreeBSD SETBUF(3)
НАЗВАНИЕ
setbuf, setbuffer, setlinebuf, setvbuf -- управление буферизацией потока
БИБЛИОТЕКА
Стандартная библиотека C (libc, -lc)
СИНТАКСИС
#include <stdio.h>
void
setbuf(FILE * restrict stream, char * restrict buf);
void
setbuffer(FILE *stream, char *buf, int size);
int
setlinebuf(FILE *stream);
int
setvbuf(FILE * restrict stream, char * restrict buf, int mode,
size_t size);
ОПИСАНИЕ
Имеются три типа буферизации: без буферизации, поблочная буферизация и
построчная буферизация. При отсутствии буферизации выходного потока
информация в конечном файле или на терминале появляется сразу же, как
только будет выполнена операция записи; при поблочной буферизации в буфер
сохраняется некоторое количество символов и все они выдаются за раз как
один блок; при построчной буферизации символы сохраняются в буфере до тех
пор, пока в выходном потоке не встретится символ новой строки или ввод не
будет читаться с любого потока, связанного с терминальным устройством
(как правило, stdin). Для принудительного вывода блока может быть
использована функция fflush(3). (Обратитесь к fclose(3).)
Как правило, все файлы буферизуются поблочно. Когда над файлом впервые
выполняется операция I/O, вызывается функция malloc(3) и выделяется буфер
оптимального размера. Если поток связан с терминалом (как это обычно
имеет место с потоком stdout), то он буферизуется построчно. Стандартный
поток диагностики stderr всегда не буферизован.
Функция setvbuf() может использоваться для изменения характера буфериза-
ции потока. Аргумент mode должен быть одним из следующих трёх макросов:
_IONBF без буферизации
_IOLBF построчная буферизация
_IOFBF полная буферизация
Аргумент size в обычном случае может принимать нулевое значение для выде-
ления буфера оптимального размера. Если он ненулевой, то, исключая слу-
чай небуферизованных файлов, аргумент buf должен указывать на буфер раз-
мером по крайней мере size байт; этот буфер будет использоваться вместо
текущего. Если buf не равен NULL, освободить этот буфер с помощью
free(3) после закрытия потока должен будет сам вызывающий код. (Если
параметр size не равен нулю, а buf равен NULL, то буфер указанного раз-
мера будет выделен немедленно и при закрытии он будет освобождён. Это
является расширением к ANSI C; в переносимом коде необходимо указывать
размер буфера равным 0, если в качестве буфера передаётся NULL.)
Функция setvbuf() может быть использована в любом месте программы, однако
она может вызвать странные побочные эффекты (такие, как уничтожение ввода
или сброс вывода), если поток ``активен''. Переносимые приложения должны
вызывать её только один раз для каждого конкретного потока, и делать это
до выполнения каких-либо операций I/O.
Другие три вызова по существу являются просто алиасами для обращений к
setvbuf(). За исключением отсутствия возвращаемого значения, функция
setbuf() в точности соответствует вызову
setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);
Функция setbuffer() делает то же самое, разве что размер буфера задаётся
явно, а не определяется по умолчанию значением BUFSIZ. Функция
setlinebuf() в точности соответствует такому вызову:
setvbuf(stream, (char *)NULL, _IOLBF, 0);
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
Функция setvbuf() возвращает 0 в случае успешного завершения, и возвра-
щает EOF, если запрос не может быть выполнен (заметьте, что в этом случае
поток продолжает нормально функционировать).
Функция setlinebuf() возвращает то же, что и соответствующий вызов
setvbuf().
СМОТРИ ТАКЖЕ
fclose(3), fopen(3), fread(3), malloc(3), printf(3), puts(3)
СТАНДАРТЫ
Функции setbuf() и setvbuf() соответствуют стандарту ISO/IEC 9899:1990
(``ISO C90'').
ПРОБЛЕМЫ
Функции setbuffer() и setlinebuf() не могут быть перенесены в BSD вплоть
до версии 4.2BSD. В системах 4.2BSD и 4.3BSD функция setbuf() всегда
использует полуоптимальный размер и её использования нужно избегать.
FreeBSD 6.2 4 июня 1993 FreeBSD 6.2