setvbuf
提供: cppreference.com
ヘッダ <stdio.h> で定義 | ||
(C99未満) | ||
(C99以上) | ||
指定されたファイルストリーム stream
のバッファリングモードを引数 mode
で指定されたように変更します。 さらに、
buffer
がヌルポインタの場合は、内部バッファのサイズをsize
に変更します。buffer
がヌルポインタでない場合は、buffer
で始まるサイズsize
のユーザ定義のバッファを使用するようストリームに指示します。 ストリームはbuffer
の指す配列の生存期間が終了する前に (fclose で) 閉じなければなりません。setvbuf
の呼び出しが成功した後、配列の内容は不定になり、それを使用する試みは未定義動作です。
目次 |
[編集]引数
stream | - | バッファを設定するファイルストリーム | ||||||
buffer | - | 使用するストリームのためのバッファを指すポインタ、またはサイズとモードのみを変更する場合はヌルポインタ | ||||||
mode | - | 使用するバッファリングモード。 以下の値のいずれかを指定できます
| ||||||
size | - | バッファのサイズ |
[編集]戻り値
成功した場合は 0、失敗した場合は非ゼロ。
[編集]ノート
この関数は stream
が開いているファイルに紐付けられた後、しかしいかなる他の操作も行われる前 (失敗した setbuf/setvbuf
を除く) にのみ、使用することができます。
size
バイトのすべてがバッファリングのために使用されるとは限りません。 実際のバッファサイズは通常、2の倍数やページサイズの倍数などに切り捨てられます。
多くの処理系では、行バッファリングは端末入力ストリームに対してのみ利用可能です。
よくある間違いは、 stdin や stdout のバッファをプログラム終了前に生存期間が終了する配列に設定することです。
デフォルトのバッファサイズ BUFSIZ は、その処理系におけるファイル入出力のために最も効率的なバッファサイズであることが期待されますが、 POSIX では fstat がしばしばより良い推定値を提供します。
[編集]例
バッファサイズを変更するひとつのユースケースは、より良いサイズが判明しているときです。
Run this code
#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