≫ ホーム ≫ C言語ヘッダファイル別一覧 | C言語アルファベット別一覧 ≫ stdio.h ≫ setvbuf
入出力用のバッファ (buffer) を設定します.
#include <stdio.h>
int setvbuf( FILE * restrict stream, char * restrict buf, int mode, size_t size );
setvbuf 関数は stream が指すストリームに対して入出力用のバッファを設定します.buf が空ポインタ (NULL) でないときは,buf がバッファとして使用されます.buf が空ポインタのときはバッファ用のメモリ空間が自動的に生成されます.
setvbuf の呼び出しが許されるのは stream の指すストリームがオープン (open) されたファイルに結び付けられてから,そのストリームに対して他の操作が行われるまでの間だけです.
引数 mode に指定できるモードは以下の通りです.
モード | 意味 |
---|---|
_IOFBF | 入出力を完全バッファリング (fully buffered) する |
_IOLBF | 入出力を行バッファリング (line buffered) する |
_IONBF | 入出力をバッファリングなし (unbuffered) しない |
setvbuf 関数を使用して標準出力 (standard output) をバッファリングするサンプルプログラムを以下に示します.
/* header files */
#include <stdio.h>
#include <stdlib.h>
/* functions */
void MySleep(int n);
/* main */
int main(void) {
/* 標準出力を行バッファリングする */
if ( setvbuf(stdout, NULL, _IOLBF, 256) !=0 ) {
fprintf(stderr, "Snoopyバッファの設定に失敗しました.\n");
return EXIT_SUCCESS;
}
/* Snoopyの出力 (改行無し) */
fprintf(stdout, "Snoopy"); /* <-- "Snoopy"がバッファリングされる */
/* 時間稼ぎ */
MySleep(100000);
/* 改行の出力 */
fprintf(stdout, "\n"); /* <-- この時点で"Snoopy\n"が出力 */
/* 標準出力をバッファリングしない */
if ( setvbuf(stdout, NULL, _IONBF, 0) !=0 ) {
fprintf(stderr, "バッファの設定に失敗しました.\n");
return EXIT_FAILURE;
}
/* Snoopyの出力 (改行無し) */
fprintf(stdout, "Snoopy"); /* <-- "Snoopy"が直接出力される */
/* 時間稼ぎ */
MySleep(100000);
/* 改行の出力 */
fprintf(stdout, "\n"); /* <-- "\n"が直接出力される */
return EXIT_SUCCESS;
}
/* 時間かせぎ */
void MySleep(int n) {
int i;
for ( i = 0; i < n * 5000; i++ );
}
サンプルプログラムの実行結果は以下のようになります.
Snoopy Snoopy
たくさんあるc言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.
c言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります.
オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.
ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.