控制流缓冲和缓冲区大小。
语法
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