setvbuf
提供: cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev ">
</tbody><tbody>
</tbody>
| ヘッダ <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 | - | 使用するバッファリングモード。 以下の値のいずれかを指定できます
| ||||||
| 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 がしばしばより良い推定値を提供します。
例
バッファサイズを変更するひとつのユースケースは、より良いサイズが判明しているときです。
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"); return 1;
}
struct stat stats;
if(fstat(fileno(fp), &stats) == -1) { // POSIX only
perror("fstat"); return 1;
}
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 errno
return 1;
}
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