setbuf, setbuffer, setlinebuf, setvbuf - операции с буферами потока
НАЗВАНИЕsetbuf, setbuffer, setlinebuf, setvbuf - операции с
буферами потока
СИНТАКСИС
#include
void setbuf(FILE *stream, char *buf);
void setbuffer(FILE *stream, char *buf, size_tsize);
void setlinebuf(FILE *stream);
int setvbuf(FILE *stream, char *buf, int mode , size_t
size);
ОПИСАНИЕ
Существует три типа буферизации: нулевая буферизация (ее
отсутствие), буферизация блока и буферизация строки. Когда
выводимые данные не буферизируются, то информация
незамедлительно оказывается на терминале (или в файле
назначения); когда производится буферизация блока, то
сохраняется большое количество символов (их блок), при
строчной буферизации все символы сохраняются в буфере до
перевода строки. Функция fflush(3) принуждает закончить
буферизацию блока раньше (см. fclose(3)). Обычно все
файлы буферизуются блоком. При операции I/O над файлом
производится вызов malloc(3), затем принимается буфер.
Если поток ссылается на терминал (как это делает stdout),
то первый буферизируется построчно. Стандартный поток
ошибок stderr по умолчанию никогда не буферизуется.
Функция setvbuf может быть использована над любым открытым
потоком для изменения типа буферизации. Параметр mode
должен быть одним из трех следующих макросов:
_IONBF (отключить буферизацию);
_IOLBF (строчная буферизация);
_IOFBF (блочная буферизация).
Аргумент buf должен указывать на буфер (кроме случаев,
когда буферизация отключается) размером, как минимум,
равным size байтам; и этот буфер будет использоваться
вместо текущего. Если аргумент buf равен NULL, то это
отразится только на буферизации; при следующей операции
считывания или записи будет создан новый буфер. Функция
setvbuf может быть использована после открытия потока и до
выполнения над ним любых операций.
Следующие три вызова идентичны по сути вызову setvbuf.
Функция setbuf в точности соответствует вызову
setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUF-
SIZ);
Функция 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 и позиция, на которую он
указывает, все еще существуют, в то время как поток
закрыт, что обычно случается при закрытии программы.
Например, следующее будет неправильным:
int main()
{
char buf[BUFSIZ];
setbuf(stdin, buf);
printf("Hello, world!\n");
return 0;
}