setvbuf
From cppreference.com
| ヘッダー <stdio.h> で定義 |
||
| (C99まで) | ||
| (C99以降) | ||
| #define _IOFBF /*未指定*/ #define _IOLBF /*未指定*/ |
||
引数modeで示されるように、指定されたファイルストリームstreamのバッファリングモードを変更します。さらに、
bufferがNULLポインタの場合、内部バッファをsizeにリサイズします。bufferがNULLポインタでない場合、bufferから始まるサイズsizeのユーザー提供バッファを使用するようにストリームに指示します。ストリームは、bufferが指す配列の生存期間が終了する前に、(fcloseで)閉じられる必要があります。setvbufの呼び出しが成功した後、配列の内容は不定であり、それを使用しようとすると未定義の動作となります。
目次 |
[編集] パラメータ
| stream | - | バッファを設定するファイルストリーム | ||||||
| buffer | - | ストリームが使用するバッファへのポインタ、またはサイズとモードのみを変更するためのNULLポインタ | ||||||
| モード | - | 使用するバッファリングモード。以下のいずれかの値を指定できます。
| ||||||
| size | - | バッファのサイズ |
[編集] 戻り値
成功した場合は0、失敗した場合は非ゼロを返します。
[編集] 注記
この関数は、streamがオープンファイルに関連付けられた後、ただし他の操作(setbuf/setvbufの失敗した呼び出しを除く)の前にのみ使用できます。
バッファリングのために必ずしもsizeバイトすべてが使用されるわけではありません。実際のバッファサイズは、通常、2の倍数、ページサイズの倍数などに切り捨てられます。
多くの実装では、ラインバッファリングは端末入力ストリームでのみ利用可能です。
stdinまたはstdoutのバッファを、プログラムの終了前に生存期間が終了する配列に設定することは一般的なエラーです。
デフォルトのバッファサイズ BUFSIZは、実装におけるファイルI/Oの最も効率的なバッファサイズであると予想されますが、POSIXのfstatはより良い推定値を提供することがよくあります。
[編集] 例
バッファサイズを変更するユースケースの1つは、より良いサイズがわかっている場合です。(この例では、filenoなどのPOSIX関数を使用しています。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 The setvbuf function (p: 225)
- C11標準 (ISO/IEC 9899:2011)
- 7.21.5.6 The setvbuf function (p: 308)
- C99標準 (ISO/IEC 9899:1999)
- 7.19.5.6 The setvbuf function (p: 273-274)
- C89/C90標準 (ISO/IEC 9899:1990)
- 4.9.5.6 The setvbuf function
[編集] 関連項目
| ファイルストリームのバッファを設定する (関数) | |
| C++ ドキュメント for setvbuf
| |