第18章 ファイル操作 その1


いよいよ、このHPでもファイルを扱うようになりました。 昔のBASIC(インタプリタの時代の)でも、ランダムアクセス ファイルのプログラムが書けるようになると一応初心者卒業と いわれていました。DOSのCでもファイル操作が、自由に行えれば 超初心者から、初心者ぐらいには格上げでしょう。(本当かね!?)

さて、ファイル操作には、高水準低水準の2つの水準があります。 ここでは、「高水準」の方を解説します。これがわかれば「低水準」 のほうもそう難しくはありません。ただし、「高水準」と「低水準」 をごちゃ混ぜにして使ってはいけません。(念のため)
今回は、まず下準備として、何か文章のはいったテキストファイルを プログラムを作っているディレクトリに入れておいてください。 「メモ帳」を使ってもいいし、ソースを書いているエディタで書いてもいいです。

ファイルの内容はどうでもいいですが、右の図のように メモ帳でテキストファイルを作ります。名前は、「test.txt」に してください。

さて、このファイルを読み出して、画面に表示するプログラム を作ります。手順としては、

(1)ファイルをオープンする
(2)ファイルを読み出して、画面表示する
(3)ファイルを閉じる

ということになります。ファイルをオープンするには、fopen()関数を使います。 この関数のプロトタイプを見てみましょう。

#include <stdio.h> FILE *fopen(const char *filename,const char *mode);

この関数の戻り値はいったい何なんだ!!!

驚く必要はありません。「*」はつい 最近やったばかりの物です。 問題は、「FILE」の方です。では、例によって stdio.hをのぞいてみましょう。

struct _iobuf { char *_ptr; int _cnt; char *_base; char _flag; char _file; }; typedef struct _iobuf FILE;

最後の行の「typedef」は、すでに以前の章で出てきましたね。 structは構造体です。 構造体_iobufはメンバとして、上のような変数を持っています。この_iobuf をFILE型という新しい、データ型に定義しています。 したがって、fopenの戻り値は、FILE型構造体へのポインタとなります。 この意味おわかりいただけたでしょうか?わからなければ、 単にFILE型へのポインタとだけ理解してください。

さて、次にfopenの引数ですが、filenameは、オープンしようとしている ファイルの名前です。modeは、

"r" 読み込み専用
"w" 描き込み用
"a" ファイルへ追加

となります。従って、「test.txt」を読み込み専用でオープンするには

fopen("test.txt", "r");

とすればよいですね。またこのfopen関数の戻り値は、いろいろ 利用されるので必ず

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 EOF (-1)

と定義されています。このdefineというのは、あとの章で解説しますが その名の通り「定義する」という意味です。

次に、ファイルのクローズですがこれは簡単です。fcloseです。 では、早速「test.txt」を読み出すプログラムを作りましょう。

必ず、fopenが失敗したときの対策を入れておきましょう。 もし、これを入れておかないと失敗したときに fpにヌルポインタが入ってやっかいなことになります。 ヌルポインタについては、いろいろ難しいことがあるので あとの章で解説するかもしれません。

実行結果は、左のようになります。改行が無視されていることに 注意してください。

念のために、「test.txt」を削除して実行したときの結果です。プログラム どおり、「ファイルのオープンに失敗しました。」と表示して 終了しています。もしプログラムの中に、fopen関数の失敗対策 を入れておかなかったら大変なことになっていました。 (どうなるかは各自で実験してみてください。その結果については 筆者は何の責任もとりません。はっはっは(笑))


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Nov/05/1996 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。