Watcom Fortran 77では、外部ファイルと措置番号を実行時に結びつけることができます。 しかし、あまり使い勝手がよいとは、限りません。 装置番号1とファイル"ABC.TXT"を結びつけるには、環境変数を設定する必要があります。
set 1=ABC.TXTこの方法だと、使っている装置番号を知っておく必要があります。あまり、賢くないやり方です。 別の方法を考えます。コマンドラインのパラメーターにファイル名を指定する方法を考えてみます。
program ABC.TXTこの方法は便利です。プログラム内部で使用されている装置番号を知る必要はありませんが、 外部ファイルと装置番号結びつける仕組みが必要です。その仕組みがWatcom Fortran 77にあり、それはopen文です。
open(unit=uid, file=fname, action=act, err=99) uid : 装置番号 fname : ファイル名(character型の文字列) act : 'READ','WRITE' 99 : ERRORが起きたときにジャンプする先このままでは、使いにくいので一枚、皮をかぶせます。fopen()です。
c fopen.for -- connect intenal file descripter and external file integer function fopen(uid, fn, act) integer uid integer*1 fn(*), act integer i character*261 cfn ! MAXNAME(261) character*5 cact ! READ WRITE include 'files.fi' if (act .eq. 82) then ! READ(LETR) cact = 'READ' else if (act .eq. 87) then ! WRITE(LETW) cact = 'WRITE' else ! error uid = -1 ! ERR(-1) fopen = -1 ! ERR(-1) return end if call is2cs(fn,cfn,261) ! MAXNAME(261) convert integer string to character string i = 1 while (i .le. 20) do ! MAXFIELS(20) if (finuse(i) .eq. 0) then ! NOUSE(0) open(unit=i, file=cfn, action=cact, err=99) finuse(i) = 1 ! INUSE(1) uid = i fopen = i if (act .eq. 82) then ! READ(LETR) flastc(i) = 81 ! MAXCARD+1(81) fbuf(i,81) = 10 ! NEWLINE(10) fbuf(i,82) = -2 ! EOS(-2) fmode(i) = 82 ! READ(LETR) else if (act .eq. 87) then ! WRITE(LETW) flastc(i) = 0 fmode(i) =87 ! WRITE(LETW) end if return endif i = i + 1 end while 99 continue uid = -1 ! ERR(-1) fopen = -1 ! ERR(-1) return end
includeは、Watcom Fortran 77の機能で、'files.fi'をコンパイル時に、読み込みます。
この中で、is2cs()は、integer*1の文字列をcharacter型の 文字列に変換するものです。
c is2cs -- copy integer string to character string subroutine is2cs(is,cs,maxsiz) integer*1 is(*) character cs(maxsiz) integer maxsiz character char integer i i = 1 ! clear character string while (i .le. maxsiz) do cs(i) = ' ' i = i + 1 end while i = 1 while (is(i) .ne. -2) do ! EOS(-2) if (i .ge. maxsiz) then ! MAXNAME(261) exit end if cs(i) = char(is(i)) i = i + 1 end while return end
files.fiは下記の通りです。
c files.fi -- file interface common valiables common /files/finuse,fbuf,flastc,fmode integer finuse(20) ! inuse flag MAXFILES(20) integer*1 fbuf(20,82) ! I/O buffer MAXFILES(20) MAXLINE(81)+1 integer flastc(20) ! characters in I/O buffer MAXFILES(20) integer*1 fmode(20) ! READ/WIRTE flag MAXFILES(20)
fopen()の逆で、ファイルを切り離すfclose()を示します。これは、Watcom Fortran 77のclose()に皮をかぶせたものです。 uid=5,6を除外しているのは、標準入力と標準出力だからです。
※コメントの受付件数を超えているため、この記事にコメントすることができません。