サイトマップ / 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言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ファイル>バッファリング有り無し||デモ用