setvbuf
|
ヘッダーで定義
<stdio.h>
|
||
| (C99まで) | ||
| (C99から) | ||
|
#define _IOFBF /*unspecified*/
#define _IOLBF /*unspecified*/
|
||
指定されたファイルストリーム
stream
のバッファリングモードを、引数
mode
で示された方法で変更します。さらに、
-
bufferがヌルポインタの場合、内部バッファをsizeにリサイズします。 -
bufferがヌルポインタでない場合、ストリームがbufferから始まるユーザー提供のサイズsizeのバッファを使用するように指示します。ストリームは、bufferが指す配列の ライフタイム が終了する前に( fclose で)閉じる必要があります。setvbufの呼び出しが成功した後の配列の内容は不定であり、それを使用する試みは未定義動作です。
目次 |
パラメータ
| stream | - | バッファを設定するファイルストリーム | ||||||
| buffer | - | ストリームが使用するバッファへのポインタ、またはサイズとモードのみを変更する場合はnullポインタ | ||||||
| mode | - |
使用するバッファリングモード。以下の値のいずれかを指定:
|
||||||
| size | - | バッファのサイズ |
戻り値
0 成功時は0、失敗時は0以外の値を返します。
注記
この関数は、
stream
が開かれたファイルに関連付けられた後、かつ他の操作(失敗した
setbuf
/
setvbuf
の呼び出しを除く)が行われる前にのみ使用できます。
すべての
size
バイトが必ずしもバッファリングに使用されるわけではありません:実際のバッファサイズは通常、2の倍数、ページサイズの倍数などに切り下げられます。
多くの実装では、行バッファリングは端末入力ストリームに対してのみ利用可能です。
よくあるエラーは、stdinまたはstdoutのバッファを、プログラム終了前に寿命が切れる配列に設定することです:
デフォルトのバッファサイズ BUFSIZ は、その実装におけるファイルI/Oで最も効率的なバッファサイズと想定されていますが、POSIXの fstat がより適切な推定値を提供することが多いです。
例
バッファサイズを変更するユースケースの1つは、より適切なサイズが既知の場合です。(この例ではいくつかのPOSIX関数を使用しています。例:
fileno
。参照:SO:
#1
および
#2
)。
// Make some POSIX functions, such as `int fileno(FILE*)`, visible: #define _POSIX_SOURCE #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> int main(void) { FILE* fp = fopen("/tmp/test.txt", "w+"); if (fp == NULL) { perror("fopen"); return EXIT_FAILURE; } struct stat stats; if (fstat(fileno(fp), &stats) == -1) // POSIX only { perror("fstat"); return EXIT_FAILURE; } 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 EXIT_FAILURE; } int ch; while((ch=fgetc(fp)) != EOF); // read entire file: use truss/strace to // observe the read(2) syscalls used fclose(fp); return EXIT_SUCCESS; }
出力例:
BUFSIZ is 8192, but optimal block size is 65536
参考文献
- C17規格 (ISO/IEC 9899:2018):
-
- 7.21.5.6 setvbuf関数 (p: 225)
- C11規格 (ISO/IEC 9899:2011):
-
- 7.21.5.6 setvbuf関数 (p: 308)
- C99規格 (ISO/IEC 9899:1999):
-
- 7.19.5.6 setvbuf関数 (p: 273-274)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 4.9.5.6 setvbuf関数
関連項目
|
ファイルストリームのバッファを設定する
(関数) |
|
|
C++ documentation
for
setvbuf
|
|