標準入出力以外のファイルの利用

計算機のオペレーティングシステム(OS)では、ふつう、情報をファイルと いう単位で管理する。 Unixでのファイル名のつけかた、特に階層型ディレクトリについては、 「Unixのファイルの相互利用」の記事参照。 プログラム言語では、 内部的にファイルに対応する変数を用意し、 なんらかの方法で、それをOSが管理するファイル名と結びつける。

以下の説明は、 フィルター型プログラムの例文 の補足例としてあげた erabu1.{p,f,c}の例文で 使っている機能に限って説明したものである。

Pascal

Pascalでは、ファイル変数というものがある。 宣言の形式は

  VAR ファイル変数名: FILE OF 要素の型
が原則である。 ただし、テキストファイル用に「TEXT」という型が用意されている。 これは、FILE OF CHARとほぼ同じだが、CHAR型以外に 整数型や実数型の変数を読み書きすることもできる。 その場合、数字と数値の間の変換が行なわれる。 この授業では使うファイルをTEXT型に限る予定である。

ファイル変数は、VARで宣言するとともに、利用開始手続き

読む場合
reset(ファイル変数)
書く場合
rewrite(ファイル変数)
を実行しておかなければならない。 ただし、標準入力用のinput、標準出力用のoutputは、あらかじめTEXT型として 定義され、しかも利用開始手続きがすんでいると考えて使ってよい。 (DEC Pascalでは、標準エラー出力用のerrも定義されている。)

DEC Pascalでは、 reset(ファイル変数, ファイル名)のような形で、 ファイル変数とUnixのファイル名との対応をつけることができる。 たとえば、

     VAR zikeiretu: TEXT;
と宣言しておいて、
     reset(zikeiretu, 'kion.tokyo');
のようにファイル名と結びつける(このファイル変数名とファイル名は単なる例)。 rewriteの場合も同様である。 ただし、他のコンパイラではreset, rewriteの機能追加ではなく、 別の手続きを使うようになっていることもある。たとえばDOS用の Borland社のTurbo Pascalでは、resetやrewriteの前にassign手続きを 呼ぶ形になっている。

また、Pascalでは、 PROGRAM文で、input, outputを含めて、利用するファイル変数名を かっこの中に列挙しておかなければならない。(コンパイラによっては これを省略できるものもある。)

実際にテキストファイルを読み書きする場合には、 read, readln, write, writeln手続きを呼ぶとき、 最初の引き数としてファイル変数を書く。 これを省略すると(つまり、最初の引き数がファイル変数でないと) 読む場合は標準入力、書く場合は標準出力を扱うことになる。

Fortran

Fortranでは、読み書きするファイルにそれぞれ整数値を対応させている。 ここではそれを装置番号と呼ぶ。 装置番号の有効な値の範囲はコンパイラによって違う。 DEC Fortranでは(たぶんg77でも同様)、 31ビット以下で表わされる0以上の整数ならなんでもよいが、 5, 6, 0はそれぞれ標準入力、標準出力、標準エラー出力のために 予約されている。(5, 6は昔からの伝統でほとんどのFortran コンパイラで予約されている。)

標準入出力以外の装置番号とファイル名を対応させる方法は、 プログラムの中でOPEN文を実行する方法と、 プログラム実行前に環境変数で指定する方法がある。

ここでは、標準が確立しているOPEN文に限って、簡単に説明する。 OPEN文のかっこの中には、ふつう、キーワードとその値を イコール印で結んだ形で書く。キーワードUNITに装置番号(整数値)を、 FILEにファイル名(文字列)を与える。次の例ではOPEN文中に 数値や文字列の定数を書きこんでしまったが、変数で与えてもよい。 STATUSは、すでにあるファイルを読むとき 'OLD' を指定する (ファイルが存在しないとエラーになる)。書くときは通常 'UNKNOWN'とする(ファイルがあれば上書きする)。

   OPEN(unit=1, file='kion.tokyo', status='OLD')
プログラム例のOPEN文の中では、以上のほか、 テキストファイルを読み書きするため accesss='SEQUENTIAL', form='FORMATTED' という指定もしているが、これは特に指定しなくても このように仮定されるはずである。

実際に読み書きをするREAD文やWRITE文では、かっこの中の 1つめの要素として、装置番号を書く。実行時に整数値がはいって いればよいので、文中に数字で書きこんでも、変数にしておいて 代入してもよい。装置番号の代わりに星印を書くこともでき、 その場合は標準入出力が使われる。

READ/WRITE文のかっこの中の2つめの要素は、書式指定といい、 文字列か、FORMAT文の文番号で指定する。ただし、星印を 書いた場合は「並びに従う入出力」といい、標準的な書式を 仮定してしまう。

C

C言語ではいろいろなライブラリ関数があるが、 ここでは1つの方式に限って述べる。

標準入出力用のscanf, printfとほとんど同じ機能の、 fscanf, fprintfという関数がある。 違いは、1つめの引き数にファイルポインタ (「 FILE *変数名」という形で宣言する)を指定することである。

ファイルポインタの宣言は、たとえば

  FILE   *yomufile, *kakufile;
のような形で行なう(yomufile, kakufileは単なる名前の例)。

ファイルポインタとOSのファイル名とを結びつけることは、 ファイルの利用開始と同時に、fopen関数によってできる。 たとえば、

  yomufile = fopen("kion.tokyo", "rt");
  kakufile = fopen("kion.tokyo.4gatu", "wt");
のようにする。2つめの引き数の文字列のうち、 r, wはそれぞれ読むため、書くために利用開始することを示す。 tはテキストファイルであるという指定だが、Unixでは特に 指定しなくてもよい。なお、ファイル名は文字配列の 変数で与えてもよい。


1996-05-11; 2000-04-18; 2002-07-11
増田 耕一 (MASUDA Kooiti)

[フィルター型プログラムの教材本文へ] [目次へ]