さて、ファイル操作には、高水準と
低水準の2つの水準があります。
ここでは、「高水準」の方を解説します。これがわかれば「低水準」
のほうもそう難しくはありません。ただし、「高水準」と「低水準」
をごちゃ混ぜにして使ってはいけません。(念のため)
今回は、まず下準備として、何か文章のはいったテキストファイルを
プログラムを作っているディレクトリに入れておいてください。
「メモ帳」を使ってもいいし、ソースを書いているエディタで書いてもいいです。
ファイルの内容はどうでもいいですが、右の図のように
メモ帳でテキストファイルを作ります。名前は、「test.txt」に
してください。
さて、このファイルを読み出して、画面に表示するプログラム を作ります。手順としては、
#include <stdio.h> FILE *fopen(const char *filename,const char *mode);
最後の行の「typedef」は、すでに以前の章で出てきましたね。 structは構造体です。 構造体_iobufはメンバとして、上のような変数を持っています。この_iobuf をFILE型という新しい、データ型に定義しています。 したがって、fopenの戻り値は、FILE型構造体へのポインタとなります。 この意味おわかりいただけたでしょうか?わからなければ、 単にFILE型へのポインタとだけ理解してください。struct _iobuf { char *_ptr; int _cnt; char *_base; char _flag; char _file; }; typedef struct _iobuf FILE;
さて、次にfopenの引数ですが、filenameは、オープンしようとしている ファイルの名前です。modeは、
とすればよいですね。またこのfopen関数の戻り値は、いろいろ 利用されるので必ずfopen("test.txt", "r");
のように受け取らなくてはいけません。FILE *fp; ..... fp = fopen("test.txt", "r");
次に、オープンしたファイルの中身を読み出すのは、 fscanf関数を使います。この関数のプロトタイプを見てみましょう。
#include <stdio.h> int fscanf(FILE *stream,const char *format 【,argument】 . . . );
うーーん!またまたよくわからんぞ! 難しく考えずに、もう何回も出てきているscanfのファイル版と考えましょう。 scanfの前にファイルを表す「f」がついたと思えばよい。(これは、筆者の こじつけかもしれません)ところで、この関数は、ファイルの最後まで行くと EOFを返します。EOFは、End of Fileの略語です。ちなみにstdio.hのなかでは
と定義されています。このdefineというのは、あとの章で解説しますが その名の通り「定義する」という意味です。#define EOF (-1)
次に、ファイルのクローズですがこれは簡単です。fcloseです。
では、早速「test.txt」を読み出すプログラムを作りましょう。
必ず、fopenが失敗したときの対策を入れておきましょう。
もし、これを入れておかないと失敗したときに
fpにヌルポインタが入ってやっかいなことになります。
ヌルポインタについては、いろいろ難しいことがあるので
あとの章で解説するかもしれません。
実行結果は、左のようになります。改行が無視されていることに
注意してください。
念のために、「test.txt」を削除して実行したときの結果です。プログラム
どおり、「ファイルのオープンに失敗しました。」と表示して
終了しています。もしプログラムの中に、fopen関数の失敗対策
を入れておかなかったら大変なことになっていました。
(どうなるかは各自で実験してみてください。その結果については
筆者は何の責任もとりません。はっはっは(笑))
Update Nov/05/1996 By Y.Kumei