#include <stdio.h> int setvbuf(FILE *stream, char *buf, int mode, size_t size) stream : FILE 構造体へのポインタ buf : バッファ.NULL の時は,自動的に指定したサイズのバッファが割り 当てられます. mode : バッファリングモード.以下の値から選択します. _IOFBF : 入出力とも完全にバッファリングします _IOLBF : 出力が行単位でバッファリングされます.DOS では, _IOFBF と同じです. _IONBF : 入出力ともバッファが使用されません. size : バッファサイズ
#include <stdio.h> #include <stdlib.h> #include <time.h> long countln(FILE *); char buf[BUFSIZ*4]; /* File buffer */ int main() { long c; time_t start_t, end_t; FILE *stream; /* 標準バッファ */ stream = fopen("test", "r"); time(&start_t); c = countln( stream ); time(&end_t); fclose(stream); printf("バッファ使用(Size : %d) Time: %f\n", BUFSIZ, difftime(end_t, start_t)); /* 大きいバッファ */ stream = fopen("test", "r"); setvbuf(stream, buf, _IOFBF, sizeof(buf)); time(&start_t); c = countln( stream ); time(&end_t); fclose(stream); printf("バッファ使用(Size : %d) Time: %f\n", BUFSIZ*4, difftime(end_t, start_t)); /* バッファ未使用 */ stream = fopen("test", "r"); setvbuf(stream, NULL, _IONBF, 0); time(&start_t); c = countln( stream ); time(&end_t); fclose(stream); printf("バッファ未使用(Size : 0) Time: %f\n", difftime(end_t, start_t)); return 0; } /****************************************/ /* テキストファイルの行数のカウント */ /* stream : ストリーム */ /* return : 行数 */ /****************************************/ long countln(FILE *stream) { long c = 0; char linebuf[256]; while(!feof(stream)) { if(fgets(linebuf, 255, stream) == NULL) break; ++c; } return c; }
バッファ使用(Size : 1024) Time: 1.000000 バッファ使用(Size : 4096) Time: 0.000000 バッファ未使用(Size : 0) Time: 23.000000
菅沼ホーム | 本文目次 | 演習問題解答例 | 付録目次 | 索引 |