サイトマップ / C言語講座>出入り口>総目次>目次:ファイル>ファイル操作の基本||デモ用
[フィボナッチ数列(動的計画法版)]←このソース→[読み込みモードで開く]
今日は高水準入出力ファイルの操作について学びます。
ストリームとは、プログラムが文字を読み書きする対象のことです。ストリームはFILE型の構造体を指すポインタ(FILE *)です。
プログラム起動時に、既に、幾つかのファイルが開いています。
今回は、高水準ファイル入出力関数について説明します。ファイルを開くには、次に示す関数を使います。
#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言語講座−それ自体コンパイルできる教材を使った講座です−