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 を返します。

有効な変更があるNULL場合stream、またはsize有効な変更内にない場合modeは、「パラメーターの検証」で説明されているように、無効なパラメーター ハンドラーが呼び出されます。 実行の継続が許可された場合、この関数は -1 を返し、errnoEINVAL に設定します。

これらのエラー コードおよびその他のエラー コードの詳細については、「errno_doserrno_sys_errlist_sys_nerr」を参照してください。

解説

setvbuf 関数により、プログラムはバッファー処理と stream のバッファー サイズの両方を制御することができます。 stream は、開かれた後に I/O 操作を行っていない開いているファイルを参照する必要があります。 参照先bufferの配列はバッファーとして使用されます。そうでない場合buffersetvbufNULL、自動的に割り当てられた長さ size/2 * 2 バイトのバッファーが使用されます。

モードは _IOFBF_IOLBF、または _IONBF である必要があります。 mode_IOFBF または _IOLBF である場合には、size がバッファーのサイズとして使用されます。 ある_IONBF場合mode、ストリームはバッファーに格納されておらず、両方sizeともbuffer無視されます。 mode の値とその意味は次のとおりです。

mode 意味
_IOFBF フル バッファリングします。つまり、buffer はバッファーとして使用され、size はバッファーのサイズとして使用されます。 あるNULL場合buffer、このモードでは、バイト長の自動的に割り当てられたバッファーがsize使用されます。
_IOLBF 一部のシステムでは、このモードではライン バッファリングが提供されます。 ただし、Win32 の動作は _IOFBF と同じで、フル バッファリングします。
_IONBF buffer または size に関係なく、バッファーは使用されません。

既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT のグローバル状態」を参照してください

必要条件

ルーチンによって返される値 必須ヘッダー
setvbuf <stdio.h>

互換性の詳細については、「 Compatibility」を参照してください。

ライブラリ

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