setvbuf
Управляет потоковой буферизацией и размером буфера.
Синтаксис
int setvbuf(
FILE *stream,
char *buffer,
int mode,
size_t size
);
Параметры
stream
Указатель на структуру FILE
.
buffer
Выделенный пользователем буфер.
mode
Режим буферизации.
size
Размер буфера в байтах. Допустимый диапазон: 2 <= size
<INT_MAX (2147483647). На внутреннем уровне значение, указанное для size
, округляется вниз до ближайшего числа, кратного 2.
Возвращаемое значение
Возвращает 0 в случае успеха.
Если stream
значение NULL
равно или size
mode
нет в допустимом изменении, вызывается обработчик недопустимых параметров, как описано в разделе проверки параметров. Если продолжение выполнения разрешено, эта функция возвращает –1 и задает для errno
значение EINVAL
.
Дополнительные сведения об этих и других кодах ошибок см. в разделе errno
, _doserrno
_sys_errlist
и _sys_nerr
.
Замечания
Функция setvbuf
позволяет программе управлять и буферизацией, и размером буфера для stream
. stream
должен ссылаться на открытый файл, который не прошел операцию ввода-вывода после открытия. Массив, на который указываетbuffer
, используется в качестве буфера, если buffer
только не используется setvbuf
NULL
автоматически выделенный буфер длины size
/2 * 2 байта.
Должен быть установлен режим _IOFBF
, _IOLBF
, или _IONBF
. Если mode
имеет значение _IOFBF
или _IOLBF
, то size
используется в качестве размера буфера. Если mode
это _IONBF
так, поток не учитывается, и оба size
и buffer
игнорируются. Переменные для функции mode
и их значения:
Значение mode |
Значение |
---|---|
_IOFBF |
Полная буферизация; то есть buffer используется в качестве буфера и size используется в качестве размера буфера. Если buffer это NULL так, этот режим использует автоматически выделенный буфер, который имеет size длину байтов. |
_IOLBF |
Для некоторых систем этот режим обеспечивает буферизацию строк. Однако для Win32 такое поведение аналогично _IOFBF , то есть полной буферизации. |
_IONBF |
Буфер не используется, независимо от функций buffer или size . |
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.
Требования
Маршрут | Обязательный заголовок |
---|---|
setvbuf |
<stdio.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Библиотеки
Все версии библиотек времени выполнения языка C.
Пример
// crt_setvbuf.c
// This program opens two streams: stream1
// and stream2. It then uses setvbuf to give stream1 a
// user-defined buffer of 1024 bytes and stream2 no buffer.
//
#include <stdio.h>
int main( void )
{
char buf[1024];
FILE *stream1, *stream2;
if( fopen_s( &stream1, "data1", "a" ) == 0 &&
fopen_s( &stream2, "data2", "w" ) == 0 )
{
if( setvbuf( stream1, buf, _IOFBF, sizeof( buf ) ) != 0 )
printf( "Incorrect type or size of buffer for stream1\n" );
else
printf( "'stream1' now has a buffer of 1024 bytes\n" );
if( setvbuf( stream2, NULL, _IONBF, 0 ) != 0 )
printf( "Incorrect type or size of buffer for stream2\n" );
else
printf( "'stream2' now has no buffer\n" );
_fcloseall();
}
}
'stream1' now has a buffer of 1024 bytes
'stream2' now has no buffer
См. также
Потоковый ввод-вывод
fclose
, _fcloseall
fflush
fopen
, _wfopen
setbuf