setbuf
ja.cppreference.net より
| ヘッダ <stdio.h>
|
||
void setbuf( FILE* stream, char* buffer );
|
(C99 まで) | |
void setbuf( FILE* restrict stream, char* restrict buffer );
|
(C99 から) | |
#define BUFSIZ /* unspecified */
|
||
ストリーム操作に使用する内部バッファを設定します。少なくとも BUFSIZ 文字の長さが必要です。
buffer が null でない場合、setvbuf(stream, buffer, _IOFBF, BUFSIZ) と同等です。
buffer が null の場合、setvbuf(stream, NULL, _IONBF, 0) と同等になり、バッファリングが無効になります。
引数
| stream | - | バッファを設定するファイルストリーム |
| buffer | - | ストリームが使用するバッファへのポインタ。ヌルポインタが指定された場合、バッファリングは無効になる |
ノート
BUFSIZ が適切なバッファサイズでない場合、setvbuf を使用して変更できます。
setvbuf はエラーを検出するためにも使用すべきです。なぜなら、setbuf は成功または失敗を示さないからです。
この関数は stream が開かれたファイルに関連付けられた後、かつ他の操作(失敗した setbuf/setvbuf の呼び出しを除く)の前でのみ使用できます。
よくある間違いは、stdin または stdout のバッファを、プログラム終了前に寿命が終了する配列に設定することです。
int main(void)
{
char buf[BUFSIZ];
setbuf(stdin, buf);
} // lifetime of buf ends, undefined behavior
例
setbuf は、即時出力が必要なストリームでのバッファリングを無効にするために使用できます。
このコードを実行する
#include <stdio.h>
#include <threads.h>
int main(void)
{
setbuf(stdout, NULL); // unbuffered stdout
putchar('a'); // 'a' appears immediately if stdout is unbuffered
thrd_sleep(&(struct timespec){ .tv_sec = 1 }, NULL); // sleep 1 sec
putchar('b');
}
出力:
ab
参考文献
- C23 標準 (ISO/IEC 9899:2024):
- 7.21.5.5 setbuf 関数 (p: TBD)
- C17 標準 (ISO/IEC 9899:2018):
- 7.21.5.5 setbuf 関数 (p: 225)
- C11 標準 (ISO/IEC 9899:2011):
- 7.21.5.5 setbuf 関数 (p: 307-308)
- C99 標準 (ISO/IEC 9899:1999):
- 7.19.5.5 setbuf 関数 (p: 273)
- C89/C90 標準 (ISO/IEC 9899:1990):
- 4.9.5.5 setbuf 関数
関連項目
| ファイルストリームのバッファとそのサイズを設定する (関数) | |
C++ ドキュメント の setbuf
| |