Страница Справочника 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