Установить параметры буферизации для потока ввода-вывода
#include <unix.h>void setbuffer( FILE *iop,char *abuf,size_t asize );
NULL
или указатель на память, которая будет использоваться для буферизации.libc
Функции setbuffer() и setlinebuf() устанавливают буферизацию дескриптору потока. Доступны следующие типы буферизации:
Для принудительной записи буферизованных данных может использоваться fflush(). Обычно файлы используют блочную буферизацию. Буфер создаётся при помощи malloc() при первом обращении через getc() или putc() к файлу. Если стандартный поток stdout ссылается на терминал, то используется строчная буферизация. Стандартный поток stderr по умолчанию не использует буферизацию.
Если требуется использовать setbuffer(), то его нужно вызывать после открытия потока ввода-вывода, но перед любым чтением или записью. Функция использует массив abuf, размер которого задаётся в asize, вместо автоматически выделяемого буфера. Если abuf равен NULL
, то ввод и вывод не буферизуются. Константа BUFSIZ
, определённая в заголовочном файле <stdio.h>
, указывает насколько большой требуется массив:
char buf[BUFSIZ];
Для изменения потока данных с небуферизованного или строчно-буферизованного на блочно-буферизованный используется freopen(). Для именения потока данных с блочно-буферизованного или строчно-буферизованного на небуферизованный вызываются freopen(), а затем setbuf() с аргументом буфера NULL
.
Unix
Распространенной ошибкой является выделение буфера с использованием переменной с ключевым словом auto в блоке кода, после чего не удаётся закрыть поток данных в этом же блоке.
fclose(), fflush(), fopen(), fread(), freopen(), getc(), malloc(), printf(), putc(), puts(), setbuf(), setlinebuf(), setvbuf()
Предыдущий раздел: Описание API системной библиотеки