Поделиться через


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