名前空間
変種
操作

setvbuf

提供: cppreference.com
< c‎ | io
 
 
ファイル入出力
型とオブジェクト
関数
ファイルアクセス
直接入出力
書式なし入出力
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)
書式付き入力
 
ヘッダ <stdio.h> で定義
int setvbuf(FILE*         stream, char*         buffer,
             int mode, size_t size );
(C99未満)
int setvbuf(FILE*restrict stream, char*restrict buffer,
             int mode, size_t size );
(C99以上)

指定されたファイルストリーム stream のバッファリングモードを引数 mode で指定されたように変更します。 さらに、

  • buffer がヌルポインタの場合は、内部バッファのサイズを size に変更します。
  • buffer がヌルポインタでない場合は、 buffer で始まるサイズ size のユーザ定義のバッファを使用するようストリームに指示します。 ストリームは buffer の指す配列の生存期間が終了する前に (fclose で) 閉じなければなりません。 setvbuf の呼び出しが成功した後、配列の内容は不定になり、それを使用する試みは未定義動作です。

目次

[編集]引数

stream - バッファを設定するファイルストリーム
buffer - 使用するストリームのためのバッファを指すポインタ、またはサイズとモードのみを変更する場合はヌルポインタ
mode - 使用するバッファリングモード。 以下の値のいずれかを指定できます
_IOFBF 完全バッファリング
_IOLBF 行バッファリング
_IONBF バッファリングなし
size - バッファのサイズ

[編集]戻り値

成功した場合は 0、失敗した場合は非ゼロ。

[編集]ノート

この関数は stream が開いているファイルに紐付けられた後、しかしいかなる他の操作も行われる前 (失敗した setbuf/setvbuf を除く) にのみ、使用することができます。

size バイトのすべてがバッファリングのために使用されるとは限りません。 実際のバッファサイズは通常、2の倍数やページサイズの倍数などに切り捨てられます。

多くの処理系では、行バッファリングは端末入力ストリームに対してのみ利用可能です。

よくある間違いは、 stdin や stdout のバッファをプログラム終了前に生存期間が終了する配列に設定することです。

int main(void){char buf[BUFSIZ];setbuf(stdin, buf);}// lifetime of buf ends, undefined behavior

デフォルトのバッファサイズ BUFSIZ は、その処理系におけるファイル入出力のために最も効率的なバッファサイズであることが期待されますが、 POSIX では fstat がしばしばより良い推定値を提供します。

[編集]

バッファサイズを変更するひとつのユースケースは、より良いサイズが判明しているときです。

#include <stdio.h>#include <stdlib.h>#include <sys/stat.h>   int main(void){FILE* fp =fopen("test.txt", "r");if(fp ==NULL){perror("fopen");return1;}   struct stat stats;if(fstat(fileno(fp), &stats)==-1){// POSIX onlyperror("fstat");return1;}   printf("BUFSIZ is %d, but optimal block size is %ld\n", BUFSIZ, stats.st_blksize);if(setvbuf(fp, NULL, _IOFBF, stats.st_blksize)!=0){perror("setvbuf failed");// POSIX version sets errnoreturn1;}   int ch;while((ch=fgetc(fp))!=EOF);// read entire file: use truss/strace to// observe the read(2) syscalls used   fclose(fp);}

出力例:

BUFSIZ is 8192, but optimal block size is 65536

[編集]参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.21.5.6 The setvbuf function (p: 308)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.19.5.6 The setvbuf function (p: 273-274)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.9.5.6 The setvbuf function

[編集]関連項目

ファイルストリームのためのバッファを設定します
(関数)[edit]
close