スポンサーリンク

SETBUF(3) FreeBSD ライブラリ関数マニュアル SETBUF(3)

名称

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

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <stdio.h>

void

setbuf(FILE *stream, char *buf);

void

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

int

setlinebuf(FILE *stream);

int

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

解説

利用できる 3 タイプのバッファリングは、バッファリングなし、ブロックバッ ファリング、および行バッファリングです。出力ストリームがバッファリングな しの場合、情報は書き込まれるとただちに書き込み先ファイルや端末に表示され ます。出力ストリームがブロックバッファリングの場合、多数のキャラクタが蓄 積されブロックとして書き込まれます。出力ストリームが行バッファリングの場 合、改行が出力されるか、または端末デバイスにアタッチされた任意のストリー ム (通常は stdin) から入力が読み込まれるまで、キャラクタが蓄えられます。 関数 fflush(3) を使用して、早めにブロックの出力を強制することもできます ( fclose(3) を参照)。

通常、すべてのファイルはブロックバッファリングされます。ファイルに対して 最初の入出力操作が発生したとき、 malloc(3) が呼び出されて最適なサイズの バッファが獲得されます。 ( stdout が通常行うように) ストリームが端末を参 照する場合は行バッファリングです。標準エラーストリーム stderr は常にバッ ファリングなしです。

setvbuf() 関数は、ストリームのバッファリング動作を変更するのに使用できま す。 mode パラメータは次の 3 つのマクロのどれかでなくてはなりません。

             _IONBF

バッファリングなし

_IOLBF
行バッファリング

_IOFBF
完全バッファリング

size パラメータは、最適サイズのバッファをいつも通りに遅延割当てさせるため に 0 に設定できます。このパラメータが 0 でない場合、バッファリングなしの ファイルを除けば、 buf 引数は少なくとも長さが size バイトのバッファを指し ていなくてはなりません。このバッファが現在のバッファの代わりに使用されま す ( size 引数が 0 でないものの、 buf が NULL の場合、指定サイズのバッ ファがただちに割り振られ、クローズ時に解放されます。これは ANSI C の拡張 です。移植可能コードはサイズが 0 の NULL バッファを使用するはずです)。

setvbuf() 関数はいつでも使用できますが、ストリームが ‘‘アクティブ’’な場合 に、 (たとえば、入力の切り捨てや出力のフラッシュ等の) 奇妙な副作用を持つ ことがあります。移植可能なアプリケーションは、なんらかの 入出力が実行され る前に、指定された任意のストリームに対してこの関数を一度だけ呼び出すべき です。

他の 3 つの呼び出しは、実際には、 setvbuf() 呼び出しの別名にすぎません。 戻り値がないことを除いて、 setbuf() 関数は以下の呼び出しと厳密に同じで す。

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

setbuffer() 関数は、バッファのサイズを呼び出し元が決め、デフォルトの BUFSIZ で決定されるのではないこと以外は同じです。 setlinebuf() 関数は、次 の呼び出しと厳密に同じです。

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

戻り値

setvbuf() 関数は正常終了すると 0 を返します。要求が受け入れられない場合は EOF を返します (ストリームはこの場合でも依然として機能していることに注意 してください)。

setlinebuf() 関数は、同等の setvbuf() 呼び出しが返したはずの値を返しま す。

関連項目

fclose(3), fopen(3), fread(3), malloc(3), printf(3), puts(3)

規格

setbuf() 関数と setvbuf() 関数は ISO/IEC 9899:1990 (‘‘ISO C89’’) に適合し ています。

バグ

setbuffer() 関数と setlinebuf() 関数は、 4.2BSD より前のバージョンの BSD へ移植可能ではありません。 4.2BSD システムと 4.3BSD システムでは、 setbuf() は、最適ではないバッファサイズを常に使用するので、避けてくださ い。

FreeBSD 10.0 June 4, 1993 FreeBSD 10.0

スポンサーリンク