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
,或如果 mode
或 size
不在有效更改之内,则调用无效参数处理程序,如参数验证中所述。 如果允许执行继续,则此函数将返回 -1 并将 errno
设置为 EINVAL
。
有关这些错误代码和其他错误代码的信息,请参阅 errno
、_doserrno
、_sys_errlist
和 _sys_nerr
。
注解
setvbuf
函数允许程序控制 stream
的缓冲和缓冲区大小。 stream
必须引用自该文件打开后尚未进行 I/O 操作的打开文件。 将 buffer
所指向的数组用作缓冲区,除非 buffer
是 NULL
,在这种情况下,setvbuf
使用长度为 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