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

標準

標準/拡張機能 C/C++ 依存項目

ISO C
POSIX.1
XPG4
XPG4.2
C99
Single UNIX Specification、バージョン 3

両方  

形式

#include <stdio.h>

int setvbuf(FILE * __restrict__stream, char * __restrict__buf, int type, size_t size);

機能説明

指定ストリームのバッファリング戦略およびバッファー・サイズ を制御します。stream ポインターはオープン・ファイルを指す必要があります。また、setvbuf() はファイルに対する最初の操作でなくてはな りません。

この関数を使用しているアプリケーションで ASCII 入出力形式を利用できるようにするには、トピック 2.1 の説明に従って、フィーチャー・テスト・マクロ __LIBASCII を定義してください。

buf が指すロケーションは、z/OS® XL C/C++ ランタイム・ライブラリーがストリーム用のバッファーとして使用するために選択できる、ユーザー提供のエリアを指定します。buf 値が NULL である場合は、そのようなエリアが提供されないこと、および z/OS XL C/C++ ランタイム・ライブラリーがストリーム用のそれ自体のバッファーの管理責任を負うことになっていることを示しています。バッファーを提供した場合には、ストリームがクローズされるまで、存在していることが必要です。

type_IOFBF または _IOLBF の場合、size は提供されたバッファーのサイズです。buf が NULL 以外の 場合には、C ライブラリーでは、size がそれ自体の バッファーの提示サイズと見なされます。type_IONBF の場合、bufsize は両方とも無視されます。バッファーに入っていない入出力は、メモリー・ファイルおよび 階層ファイル・システム (HFS) ファイルで許可されます。ただし、Hiperspace™・メモリー・ファイルでは許可されま せん。ハイパースペース・メモリー・ファイルに対して指定されたバッファーのサイズが 4k を超える場合、バッファーの最初の 4k のみが使用されます。
意味
_IONBF
バッファーが使用されていません。
_IOFBF
フル・バッファリングは、入出力のために使用されます。buf をバッファーとして、size をバッファー のサイズとして使用してください。
_IOLBF
行バッファリングは、テキスト・ストリーム入出力および端末入出力で使用されます。バッファーがフラッシュされるのは、改行文字 (テキスト・ストリーム) が使用されるとき、バッファーがいっぱいのとき、または入力が要求される (端末) ときです。size の値は、0 より大きいことが必要です。

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

注: setvbuf() または setbuf() を使用して、ストリームについて独自のバッファーを定義する場合には、プログラムの終了後もバッファーが使用可能であること、あるいは exit() を呼び出す前に、ストリームがクローズまたはフラッシュされることを確認する必要があります。これは、配列をファイル・スコープで定義するか、または malloc() を 使用する配列にストレージを動的に割り振ることによって行うこと ができます。

例えば、バッファーが関数ブロックのスコープ内で宣言され る場合には、stream は、関数の終了前にクローズ する必要があります。これによって、バッファーに割り振られるストレージの解放が回避されます。

戻り値

正常に実行された場合、バッファー不使用を選択した場合でも、setvbuf() は 0 を戻します。

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

/* This example sets up a buffer of buf for stream1 and specifies that
   input from stream2 is to be unbuffered.
 */
#include <stdio.h>
#define  BUF_SIZE  1024

char buf[BUF_SIZE];

int main(void)
{
   FILE *stream1, *stream2;

   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 1");

   /* stream2 is unbuffered                                 */
   if (setvbuf(stream2, NULL, _IONBF, 0) != 0)
      printf("Incorrect type or size of buffer 2");
⋮
}

関連情報