サイトマップ / C言語講座出入り口総目次目次:ファイル>ファイル操作の基本||デモ用

青い直線

ファイル操作の基本

青い直線

[フィボナッチ数列(動的計画法版)]←このソース→[読み込みモードで開く]

/* ファイル操作の基本

今日は高水準入出力ファイルの操作について学びます。

ストリームとは、プログラムが文字を読み書きする対象のことです。ストリームはFILE型の構造体を指すポインタ(FILE *)です。

プログラム起動時に、既に、幾つかのファイルが開いています。

ファイル名 そ  の  用  途
stdin 標準入力(キーボードからの入力)
stdout 標準出力(モニタ画面への出力)
stderr 標準エラー出力(モニタ画面への出力)

ファイルに関する豆知識

  1. 標準出力(stdout)と標準エラー出力(stderr)の違いについては、バッファリング有り無しを参照のこと。
  2. printf( )はstdoutに文字を書き込みます。printf("あれ\n");とfprintf(stdout, "これ\n");は同じです。
  3. scanf( )はstdinから文字を読み取ります。
  4. stdio.hの中に、"#define FOPEN_MAX 15"と記述されていたら、1度に開くことのできるファイルの数は15です。
  5. ファイルはEOFという、特別な値で終了します。stdio.hの中に、"#define EOF (-1)"と記述されているはずです。
  6. ファイル操作に関わる関数には、低水準ファイル入出力関数(レベル1)と、高水準ファイル入出力関数(レベル2)があります。低水準ファイル入出力関数は、バファリングその他のサービスをしない、よりOSに近い関数です。

ファイルを開くには

今回は、高水準ファイル入出力関数について説明します。ファイルを開くには、次に示す関数を使います。

    #include <stdio.h>
    FILE *fopen(const char *filename, const char *mode);
    例:fp = fopen(filename, "r");

    実行結果    戻り値
    成功        ファイル(ストリーム)へのポインタ
    失敗        NULL

NULLはstdio.hの中で、((void *)0)と定義されています。

fopen( )の最初の引数はファイルの名前で、2番目の引数は開くファイルのモードです。モードの指定について説明します。

モード モ ー ド の 説 明
r 読み込みモードで開く。
w 書き込みモードで開く(ファイルが既に存在する場合は上書きする。)
a 追加(append )モードで開く(書き込みは、ファイルの末尾に追加される)。
r+, w+, a+ 更新モードで開く(このモードでは、読み込みと書き込みの両方が可能)。

上記のモードは組み合わせて使用できます。以下に、その全ての組み合わせを示します。fopen( )の" "の中に"b"の文字があれば、バイナリモードでファイルを開きます。なければテキストモードで開きます。

モードの組み合わせ モ  ー  ド  の  説  明
r 読み込み用のテキストファイル
w 書き込み用のテキストファイル
a 追加モードのテキストファイル(ファイルの末尾に追加)
rb 読み込み用のバイナリファイル
wb 書き込み用のバイナリファイル(ファイルが既に存在する場合は上書き)
ab 追加モードのバイナリファイル(ファイルの末尾に追加)
r+ 更新モードのテキストファイル
w+ 更新モードのテキストファイル(ファイルが既に存在する場合は上書き)
a+ 更新モードのテキストファイル(ファイルの末尾に追加)
r+b または rb+ 更新モードのバイナリファイル
w+b または wb+ 更新モードのバイナリファイル(ファイルが既に存在する場合は上書き)
a+b または ab+ 更新モードのバイナリファイル(ファイルが既に存在する場合は上書き)

このように細かい指定が可能ですが、その分複雑です。当面は、"r"と"w"のモードしか使いません。次に、fopen( )の使用例をあげます。

    FILE *fp;
    fp = fopen( "filename", "r" );

fpは、FILEという構造体へのポインタです。このようなポインタのことを、ファイルポインタといいます。ファイルポインタを表すために、このような命名法が良く使われます。

    例:fp, newfp, oldfp, stream

これで、"filename"という名前のファイルを読み込みモードで、開くことができます。以後、そのファイルを操作する時はファイルポインタを通して行います。具体例をあげる前に、FILEという構造体について説明します。FILE という構造体は stdio.hの中で定義されています。この構造体の値を直接読み書きすることはないので、これ以上の説明はしません。詳しくは、stdio.hをご覧下さい。

前述したように、fopen( )等で、ファイルを開くと、そのファイルの構造体へのポインタが返ってきます。

    fp = fopen("filename", "r");

上記のコードでファイルを読み込みモードで開くことができます。しかし、そのファイルが存在しなければ、開くことができません。失敗した場合、fopen( ) は NULLという値を返します。既に開いているファイルが、一度に開くことのできるファイルの最大数に達しているかも知れません。

重要:ファイルは必ずしも、いつでも開くことができるとは限りません。

そこで、次のように記述するのが普通です。

    if ((p = fopen("filename", "r")) == NULL)
        exit(2);

exit( )を使うには、stdlib.hをインクルードしておく必要があります。exit( )の引数は現在では意味がなく、コンパイラも無視しますが、異常終了の場合には、exit(2)と、引数を2とする習慣が残っています。

ファイルを閉じるには

    #include <stdio.h>
    int fclose(FILE * fp);

    例:fclose(fp);

    関数の実行結果        戻り値
    成功した場合            0
    失敗した場合          EOF

重要:開いたファイルは、不要になった時点、または、プログラムの終了時に閉じなければなりません。

fopen( )とfclose( )の説明はこれで終わりです。

ソースプログラムの説明

今日のソースプログラムの説明に入ります。10行目で、fopen( )を使って、読み込み用ファイルを開きます。失敗した場合、stderrにメッセージを送ってプログラムは終了します。プログラムを強制終了させるには、exit( )を使います。

    #include <stdlib.h>
    void  exit( int status);

    例:exit(0);

status は無視されます。0や1などの数字を入れておきます。正常終了の場合は0、このように異常終了の場合は2とする習慣が残っています。exit( ) はプログラムを終了させる前に、全ての開いているファイルを閉じ、全ての一時ファイルを削除します。

ソースプログラムの中に、下記の表現があります。少し複雑なので分解して説明します。

    while ((c = fgetc(fp)) != EOF)

c = fgetc(fp)について。fgetc( )はファイルポインタで指定されるファイルから、1文字読み込みます。読み込まれた文字を、cに代入します。

    #include <stdio.h>
    int fgetc(FILE *fp);

    例:c = fgetc(fp);

    関数の実行結果        戻り値
    成功した場合          ファイルの次の文字
    失敗した場合          EOF

(c = fgetc(fp)) != EOFについて。=よりも!=の方が演算の優先順位が高いので、c = fgetc(fp)の外側のカッコは必要です。

ファイルを読み進んでいくと、ファイルの終わりに達します。ファイルは、EOFという特別な値で終わります。fgetc( )は、ファイルの終わりでcに EOFを代入します。そうすると、このループから抜けます。

ループの中に、fputc( )があります。fputc(c, stdout) は stdout(コンピュータの画面)に、1 文字出力します。

	#include <stdio.h>
	int fputc(int c, FILE *fp);

	例:fputc(c, fp);
		
	関数の実行結果		戻り値
	成功した場合		文字 c の値
	失敗した場合		EOF

今回のソースプログラムは、ファイルを読み込みモードで開き、その内容を表示し、ファイルの終わりに達すると、下記の標準ライブラリ関数で、ファイルを閉じます。

    #include <stdio.h>
    int fclose(FILE *fp);

    例:fclose(fp);

    関数の実行結果        戻り値
    成功した場合          0
    失敗した場合          EOF

出来上がった実行可能なファイルと、デモ用ファイルを"Filex.txt"というファイル名に変えたものを、同じフォルダに置いてから実行して下さい。 */

/* ここからソースプログラム */

#include <stdio.h>
#include <stdlib.h>    /* exit(  )で必要 */

void main(void);

void main(void)
{
    FILE *fp;
    int c;

        /* ファイルを開くのに失敗したら */
        /* プログラムを終了して、シェルに戻る */
    if ((fp = fopen( "Filex.txt", "r")) == NULL) {
        fprintf(stderr, "Can't Open File\n");
        exit(2);	
    }			

                        /* ファイルの終わりに達するまで */
    while ((c = fgetc(fp)) != EOF)    /* 一文字読み込み */
        fputc(c, stdout);             /* 画面に表示 */

    fclose(fp);                       /* ファイルを閉じる */
}

/* ここまでソースプログラム */

[フィボナッチ数列(動的計画法版)]←このソース→[読み込みモードで開く]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ファイル>ファイル操作の基本||デモ用