サイトマップ / C言語講座>出入り口>総目次>目次:ファイル>バッファリング有り無し||デモ用
[二分木探索(バイナリサーチ)]←このソース→[起動後の経過時間]
/* 標準ライブラリ関数 setbuf( ) について学びます。
ストリームとは、ソフトウエアが文字を読み書きする対象のことです。ストリームは、ファイルか、キーボードかコンソールになります。setbuf( ) は、ストリームに対し、バッファリングするかしないか指定します。バッファリングしないと、ストリームに対し、文字を一字づつ読み込みまたは書き込みます。バッファリングすると、書き込みに対しては、文字を受け取り、バッファが満杯になると書き込みます。読み込みに対しては、文字を渡し、バッファが空になると、満たします。
fopen( ) は、ファイルを開いて、このファイルのストリームにバッファを、自動的に割り当て、バッファリングした状態に設定します。バッファのサイズは、記号定数BUFSIZE と見なされます。BUFSIZE は stdio.h の中で定義されています。例えば、あるコンパイラでは、”#define BUFSIZE 1024”となっていました。'1024' という値については、処理系により異なります。'512' としているのもありました。
標準ライブラリ関数、setbuf( ) について説明します。
#include <stdio.h> void setbuf(FILE *fp, char *buff); 例:setbuf(fp, buff); 実行結果 戻り値 成功 0 失敗 0 以外の値
重要:setbuf( ) の呼び出しは、ストリーム ( ファイル ) を開いてから、読み込みや書き込みをする前に行います。
buff で指定されるサイズのバッファリングをするようにストリームを設定します。バッファリングしないように設定するには、buff に NULL を指定します。
まず最初にこのファイルを開いて下さい。コンパイルしたら、"Text.html"の名前を"Text.txt"に変更し、同じフォルダーに置いてから実行してみて下さい。
今回のソースプログラムでは、同じフォルダの中にある "Test.txt" を読み込み専用 ( "r" ) で開き、バッファリングなしで、ファイルの中身を表示し、次いで、ファイルを閉じ、再度ファイルを開き、今度は LEN_BUFF のサイズで、バッファリングして、ファイルの中身を表示します。 */
#include <stdio.h> #include <stdlib.h> /* malloc( ) で必要 */ #define LEN_BUFF 512 /* 変更するバッファのサイズ */ void main(void); void main(void) { FILE *fp; int c; char *buff; if ((fp = fopen("Text.txt", "r")) == NULL) { fprintf(stderr, "ファイルを開くのに失敗しました!\n"); exit (2); /* 失敗したらシェルに戻る */ } setbuf(fp, NULL); printf(" ************ バッファリング無し ************\n" ); while ((c = fgetc(fp)) != EOF) /* EOF に達するまで、 */ putchar(c); /* ファイルの中身を1字ずつ表示 */ fclose(fp); if ((fp = fopen("Test.txt", "r")) == NULL) { fprintf(stderr, "ファイルを開くのに失敗しました!\n"); exit (2); /* 失敗したらシェルに戻る */ } /* バッファ用のメモリを割り付け */ buff = (char *)malloc(LEN_BUFF); setbuf(fp, buff); printf(" ************ バッファリング有り ************\n"); while ((c = fgetc(fp)) != EOF) /* EOF に達するまで、 */ putchar(c); /* ファイルの中身を1字ずつ表示 */ fclose(fp); free(buff); /* malloc( ) で割り付けられたメモリを解放 */ } |
/*
while ((c = fgetc(fp)) != EOF)
このようなC特有の表現に、慣れてきましたでしょうか。'=' 演算子の優先順位は、'!=' 演算子より低いので、'c = fgetc(fp)' を囲むカッコは必要です。 */
[二分木探索(バイナリサーチ)]←このソース→[起動後の経過時間]
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−