setvbuf() — バッファリングの制御

形式

#include <stdio.h>
int setvbuf(FILE *stream, char *buf, int type, size_t size);

言語レベル

ANSI

スレッド・セーフ

はい

説明

setvbuf() 関数を使用すると、指定されたストリームのバッファリング・ストラテジーおよびバッファー・サイズを制御できます。 setvbuf() 関数は、統合ファイル・システムを使用する場合に ILE C でのみ機能します。 ストリームは、オープンされているが、読み取りや書き込みが行われていないファイルを示す必要があります。

buf が指す配列は、ストリーム用のバッファーとして使用するために C ライブラリーが選択できる、 ユーザー提供のエリアを指定します。 buf 値が NULL である場合は、そのようなエリアが提供されていないため、ストリーム用の独自のバッファーの管理を、C ライブラリーが担当することを示しています。 バッファーを提供した場合には、ストリームがクローズされるまで、存在していることが必要です。

type は、以下のいずれかにする必要があります。
意味
_IONBF
バッファーが使用されていません。
_IOFBF
フル・バッファリングは、入出力のために使用されます。 buf をバッファーとして、size をバッファー のサイズとして使用してください。
_IOLBF
行バッファリングが使用されます。 バッファーが削除されるのは、改行文字が書き込まれるとき、バッファーがいっぱいのとき、 または入力が要求されるときです。

type_IOFBF または _IOLBF の場合、size は提供されたバッファーのサイズです。 bufNULL の場合には、 C ライブラリーでは、size がそれ自体のバッファーの提示サイズと見なされます。 type_IONBF の場合、bufsize は両方とも無視されます。

size の値は、0 より大きいことが必要です。

戻り値

setvbuf() 関数は、正常に実行された場合、 0 を戻します。 パラメーター・リストで無効な値が指定されたか、要求を実行できない場合には、この関数はゼロ以外を戻します。

setvbuf() 関数は、 stdoutstdin、または stderrには影響しません。

重要: バッファーとして使用される配列は、 指定された stream がクローズしても、引き続き存在しています。 例えば、バッファーが関数ブロックのスコープ内で宣言される場合には、 stream は、関数の終了前にクローズし、バッファーに割り振られたストレージを解放する必要があります。

この例では、stream1 のバッファー buf をセットアップし、 stream2 への入力をバッファーに入れないことを指定します。
#include <stdio.h>
 
#define  BUF_SIZE  1024
 
char buf[BUF_SIZE];
FILE *stream1, *stream2;
 
int main(void)
{
   stream1 = fopen("myfile1.dat", "r");
   stream2 = fopen("myfile2.dat", "r");
 
   /* stream1 uses a user-assigned buffer of BUF_SIZE bytes */
   if (setvbuf(stream1, buf, _IOFBF, sizeof(buf)) != 0)
      printf("Incorrect type or size of buffer\n");
 
   /* stream2 is unbuffered                                  */
   if (setvbuf(stream2, NULL, _IONBF, 0) != 0)
      printf("Incorrect type or size of buffer\n");
 
/*  This is a program fragment and not a complete function example  */
 
}

関連情報