EN JA
SETBUF(3)
SETBUF(3) FreeBSD Library Functions Manual SETBUF(3)

名称

setbuf, setbuffer, setlinebuf, setvbufストリームのバッファリング操作

ライブラリ

Standard C Library (libc, -lc)

書式

#include < stdio.h>

void
setbuf( FILE * restrict stream, char * restrict buf);

void
setbuffer( FILE *stream, char *buf, int size);

int
setlinebuf( FILE *stream);

int
setvbuf( FILE * restrict stream, char * restrict buf, int mode, size_t size);

解説

利用可能な 3 つのタイプのバッファリングは、バッファリングされない、ブロック単位のバッファリングと行単位のバッファリングです。出力ストリームがバッファリングされないとき、情報は、書き込まれるとすぐに、目的のファイルまたは端末に現われます。ブロック単位のバッファリングのとき、多くの文字は、保存され、ブロックとして書き込まれます。行単位のバッファリングのとき、改行が出力されるか、または入力が端末デバイス (一般的に stdin) にアタッチされるあらゆるストリームから読み込まれるまで、文字は、保存されます。関数 fflush(3) は、強制的に早くブロックを出力するために使用されます。 ( fclose(3) を参照。)

通常、すべてのファイルは、バッファをブロック単位でバッファリングされます。最初の I/O 操作がファイルで起こるとき、 malloc(3) が呼び出され、最適なサイズのバッファが取得されます。ストリームが端末 ( stdout が通常行うように) を参照するなら、それは、行単位でバッファリングされます。標準エラーストリーム stderr は、常にバッファリングされません。これらのデフォルトは、 stdbuf(1) ユーティリティを使用して変更されるかもしれないことに注意してください。

setvbuf() 関数は、ストリームのバッファリングの振る舞いを変更するために使用されます。 mode 引数は、次の 3 つのマクロの 1 つでなければなりません:

_IONBF
バッファリングされない
_IOLBF
行単位のバッファリング
_IOFBF
完全なバッファリング

size 引数は、いつものとおり、延期された最適なサイズのバッファ割り付けを取得するために、0 として与えられます。それが 0 でないなら、バッファリングされないファイルを除いて、 buf 引数は、少なくとも size バイトのバッファを指すべきです。このバッファは、現在のバッファの代わりに使用されます。 bufNULL でないなら、ストリームをクローズした後に、このバッファを free(3) (解放) するのは呼び出し側の責任です。 ( size 引数が 0 ではないが、 bufNULL であるなら、与えられたサイズのバッファは、直ちに割り付けられ、クローズで解放されます。これは、ANSI C の拡張です。移植性のあるコードは、任意の NULL バッファで 0 のサイズを使用するべきです。)

setvbuf() 関数は、いつでも使用できますがが、ストリームが ``アクティブ'' であるなら、 (入力を廃棄するか、または出力をフラッシュするような) 特有の副作用があるかもしれません。移植性のあるアプリケーションは、あらゆる I/O が実行される前に、任意の与えられたストリームで一度だけ呼び出されるべきです。

他の 3 つの呼び出しは、実質的に、 setvbuf() への呼び出しのための単なる別名です。返り値がないことを除いて、 setbuf() 関数は、次の呼び出しと正確に同等です。

setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);

setbuffer() 関数は、デフォルトの BUFSIZ によって決定されるのではなく、バッファのサイズが呼び出し側の責任であることを除いて、同じです。 setlinebuf() 関数は、次の呼び出しと正確に同等です:

setvbuf(stream, (char *)NULL, _IOLBF, 0);

戻り値

setvbuf() 関数は、成功すれば、0 を返し、要求を引き受けることができないなら、 EOF を返します (この場合、ストリームが、まだ機能していることに注意)。

setlinebuf() 関数は、同等の setvbuf() が返したものを返します。

規格

setbuf() と setvbuf() 関数は、 ISO/IEC 9899:1990 (“ISO C90”) に適合しています。

バグ

setbuf() は、通常次善のバッファサイズを使用し、回避されるべきです。
February 18, 2013 FreeBSD