外部ファイルの結びつけ、fopen(),fclose(),initfile()
2015-01-11


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を除外しているのは、標準入力と標準出力だからです。



続きを読む

[コンピューター]
[RATFOR]

コメント(全50件)
※コメントの受付件数を超えているため、この記事にコメントすることができません。


記事を書く
powered by ASAHIネット