バッファリング

 今回は、C言語のファイルの読み込み・書き込み処理に関する応用的な概念としてバッファリングについて説明します。

 ストリームのところで、ファイルから読み込む(ファイルに書き込む)場合、ファイルとプログラムの間にストリームという経路ができ、そこを通ってデータが読み込まれる(書き込まれる)ことをお伝えしました。通常、1文字ずつストリームを通ってデータはやり取りされますが、バッファリングを使用した場合、ある程度データが溜まったところで一気にデータがストリームを通ってファイルに書き込まれる(ファイルから読み込まれる)ようになります。「ししおどし」みたいなものです。プログラムもファイルも同じパソコン上であれば、さほど影響は無いですが、ファイルが離れたところにある場合、1文字ずつ書き込む(読み込む)ためだけに都度、通信を発生させるよりは、ある程度データがまとまった段階で送るようにした方が通信の回数が少なくなるという利点があり、このバッファリングの機能が搭載されました。

 バッファリングの機能を試す前に、まずはファイルを作成します。

#include <stdio.h>

int main(int argc, const char * argv[])
{
    
    // insert code here...
    
    // ファイルのオープン
    FILE *fp;
    fp = fopen("testfile4.txt", "w");
    
    // ファイルに書き込み
    fputs("abcdefghijklmnopqrstuvwxyz0123456789", fp);
    
    // ファイルのクローズ
    fclose(fp);
    
    return 0;
}

 このプログラムを実行し、「abcdefghijklmnopqrstuvwxyz0123456789」と書かれたtestfile4.txtを作成します。その後、

#include <stdio.h>

int main(int argc, const char * argv[])
{
    
    // insert code here...
    
    // ファイルのオープン
    FILE *fp;
    if((fp = fopen("testfile4.txt", "r")) == NULL) {
        printf("ファイルを開けませんでした。");
    } else {
        
        // バッファリングを設定
        char buffer[100];
        setbuf(fp, buffer);
        
        // ファイルから読み込み
        char ch[40];
        fgets(ch, 40, fp);
        printf("%s", ch);
        
        // ファイルのクローズ
        fclose(fp);
     
    }
    
    return 0;
}

 画面に「abcdefghijklmnopqrstuvwxyz0123456789」と表示されることを確認して下さい。バッファリングを使うにはsetbuf関数を実行します。引数の1番目にはファイルポインタ、2番目の引数には、溜めておくための充分な大きさの配列を指定して下さい。

■スポンサーリンク

このページの先頭へ