名称
setbuf(), setvbuf() ― ストリームファイルへのバッファリング
構文
#include <stdio.h>
void setbuf(FILE *stream, char *buf);
int setvbuf(FILE *stream, char *buf, int type, size_t
size);
廃止インタフェース
int setvbuf_unlocked(FILE *stream, char *buf, int
type, size_t size);
説明
setbuf() は、ストリームがオープンされた後で、読み込みや書き込みの前に用いられます。
自動的に割り当てられるバッファーの代わりに、 buf を用いて配列を指します。 buf が NULL ポインターである場合は、入力/出力はまったくバッファリングされません。
ヘッダーファイル <stdio.h> で定義されている定数 BUFSIZ は、必要な配列の大きさを表します。
setvbuf() は、ストリームがオープンされた後で、読み込みや書き込みの前に用いられます。 type は stream がどのようにバッファリングされるかを指定します。 type の値として適切な値 (<stdio.h> 中で定義されている)
は以下のとおりです。
| _IOFBF | | 入力/出力はフルバッファリングされます。 |
| _IOLBF | | 出力はラインバッファリングされます。バッファーは、新しいラインが書かれるか、バッファーがいっぱいになるか、入力が要求されたときに出力されます。 |
| _IONBF | | 入力/出力はまったくバッファリングされません。 |
出力ストリームがバッファリングされていないときには、情報は、宛先ファイルまたはターミナルに書き出すために、書き込みが行われた時点でキューに加えられます。すなわち、バッファリングされるときには、多くの文字が蓄えられ、ブロックとして書き出されます。
ストリームがラインバッファリングされているときには、各出力ラインはラインが終了した時点で
(すなわちニューライン文字が来たとき、またはターミナル入力が要求されたとき)
キューに加えられ、宛先ファイルまたはターミナルに書き出されます。 fflush() は、バッファーへの書き込みを明示するときにも用いられます。
buf が NULL ポインターでないときには、 (malloc() によって)
自動的に割り当てられるバッファーの代わりに、ポインターの指す配列をバッファリングに使用します。 size は使用するバッファーのサイズを指定します。 <stdio.h> 中の定数 BUFSIZ は、適切なバッファーのサイズを示しています。
入力/出力がバッファリングされていない時には、 buf および size は無視されます。
デフォルトでは、ターミナルへの出力はラインバッファリングされ、その他の入力/出力はすべてフルバッファリングされます。
廃止インタフェース
バッファリングをストリームファイルに割り当てる setvbuf_unlocked()
診断
type または size への値が不適切であれば、 setvbuf() および setvbuf_unlocked() は、0 でない値を返します。値が適切であれば、戻り値は 0 になります。
注記
起こりやすいエラーの原因としては、コードブロック内の「自動」変数にバッファースペースを割り当てて、同じブロック内でストリームのクローズを忘れることがあります。
size または BUFSIZ バイトのバッファーを割り当てても、 size または BUFSIZ バイト全部が、バッファー領域として使用される訳ではありません。
標準準拠
setbuf(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C
setvbuf(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, ANSI C