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