外部ファイルの入出力、fputc(),fgetc()
2015-01-19


前回作成したファイルのオープン、クローズルーチンと併せて使用する、ファイル読み書きルーチンを示します。

はじめに、一文字書き出しルーチンfputc()です。putc()を拡張しています。

c fputc.for (extended version) -- put character on file
      subroutine fputc(u,c)
      integer i, u
      integer*1 c

      include 'files.fi'

      if (c .eq. -1 .and. flastc(u) .eq. 0) then
          return                        ! buffer is empty, nothing to do
      end if
      if (flastc(u) .ge. 80 .or. c .eq. 10 .or. c .eq. -1) then ! MAXCARD(80) NEWLINE(10) EOF(-1)
          write(u,10) (fbuf(u,i),i=1,flastc(u))
   10     format(80a1)                  ! MAXCARD(80)
          flastc(u) = 0
      end if
      if (.not. (c .eq. 10 .or. c .eq. -1)) then ! NEWLINE(10) EOF(-1)
          flastc(u) = flastc(u) + 1
          fbuf(u,flastc(u)) = c
      end if
      return
      end

次に、一文字読み込みルーチンfgetc()です。これは、getc()を拡張しています。

c fgetc.for -- (extended version) get character from unit u
      integer*1 function fgetc(u,c)
      integer u
      integer*1 c
      integer col, i

      include 'files.fi'

      flastc(u) = flastc(u) + 1
      if (flastc(u) .ge. 80 .or. fbuf(u,flastc(u)) .eq. -2) then ! MAXCARD(80) EOS(-2)
          read(u,10,end=9) (fbuf(u,i),i=1,80) ! MAXCARD(80)
   10     format(80a1)                  ! MAXCARD(80)
          flastc(u) = 1
          col = 80
          while (fbuf(u,col) .eq. 32) do ! BALNK(32)
              col = col - 1
          end while
          fbuf(u,col+1) = 10            ! NEWLINE(10)
          fbuf(u,col+2) = -2            ! EOS(-2)
      endif
      c = fbuf(u,flastc(u))
      fgetc = fbuf(u,flastc(u))
      return
    9 continue
      c = -1                            ! EOF(-1)
      fgetc = -1                        ! EOF(-1)
      return
      end

ここで、問題が生じました。fgetc(5,c)とgetc(c)が交互に呼ばれたらどうなるでしょうか。また、fputc(6,c)とputc(c)が、 交互に呼ばれたらどうなるでしょうか。悲劇が起きます。原因は、どこにあるでしょうか。原因究明は次回に致します。

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

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


記事を書く
powered by ASAHIネット