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。

如果 streamNULL,或如果 modesize 不在有效更改之内,则调用无效参数处理程序,如参数验证中所述。 如果允许执行继续,则此函数将返回 -1 并将 errno 设置为 EINVAL

有关这些错误代码和其他错误代码的信息,请参阅 errno_doserrno_sys_errlist_sys_nerr

注解

setvbuf 函数允许程序控制 stream 的缓冲和缓冲区大小。 stream 必须引用自该文件打开后尚未进行 I/O 操作的打开文件。 将 buffer 所指向的数组用作缓冲区,除非 bufferNULL,在这种情况下,setvbuf 使用长度为 size/2 * 2 字节的自动分配的缓冲区。

此模式必须是 _IOFBF_IOLBF_IONBF。 如果 mode_IOFBF_IOLBF,则将 size 用作缓冲区的大小。 如果 mode_IONBF,则该流取消缓冲并同时忽略 sizebuffermode 的值及其含义是:

mode 含义
_IOFBF 完全缓冲;也就是说,将 buffer 用作缓冲区并将 size 用作缓冲区的大小。 如果 bufferNULL,则此模式使用长度为 size 字节的自动分配缓冲区。
_IOLBF 对于某些系统,此模式会提供行缓冲。 但是,对于 Win32,该行为与 _IOFBF 完全缓冲一样。
_IONBF 将不会使用缓冲区,无论 buffersize

默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 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

另请参阅

流 I/O
fclose_fcloseall
fflush
fopen_wfopen
setbuf