setbuffer()

Установить параметры буферизации для потока ввода-вывода

Прототип:

#include <unix.h>
void setbuffer( FILE *iop,
char *abuf,
size_t asize );

Аргументы:

iop
Дескриптор потока ввода-вывода, для которого требуется установить буферизацию.
abuf
NULL или указатель на память, которая будет использоваться для буферизации.
asize
Размер буфера памяти.

Библиотека:

libc

Описание:

Функции setbuffer() и setlinebuf() устанавливают буферизацию дескриптору потока. Доступны следующие типы буферизации:

Без буфера
Данные незамедлительно записываются в файл или терминал.
Блочная буферизация
Данные сохраняются и записываются поблочно.
Строчная буферизация
Данные сохраняются, пока не встретится символ новой строки или не будет произведен ввод из stdin.

Для принудительной записи буферизованных данных может использоваться 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 системной библиотеки