Namespaces
Variants

setbuf

ja.cppreference.net より
< c | io
 
 
ファイル入出力
型とオブジェクト
        
関数
ファイルアクセス
(C95)
書式なし入出力
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

書式付き入力
 
ヘッダ <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 関数

関連項目

ファイルストリームのバッファとそのサイズを設定する
(関数)