14. 파일 입출력 (File I/O)

이제까지는 입력/출력을 표준 입력 standard input과 표준 출력 standard ouput을 가정하였다. 그러나 외부 저장 장치 즉, 디스크(hard or floppy disk)나 테이프에 저장한 file 에 쓰거나 읽어들일 수도 있다. Fortran에서는 각각의 file이 1 부터 99 사이의 정수인 장치 번호 unit number에 대응된다. 어떤 장치 번호는 이미 설정되어 있다. 즉 5는 표준 입력 standard input, 6은 표준 출력 standard output이다.

file을 열기와 닫기 (Opening and closing a file)

file을 사용하기 전에 열어야 open 한다. 명령은
    open (list-of-specifiers)
으로 많이 사용하는 규정자(specifier)로는:
    [UNIT=]  u
    IOSTAT=  ios
    ERR=     err
    FILE=    fname
    STATUS=  sta
    ACCESS=  acc
    FORM=    frm
    RECL=    rl
등이 있다. 장치 번호 u 는 file을 나타내는 9에서 99사이의 숫자 하나로 프로그램하는 사람이 임의로 택할 수 있지만 다른 곳에서는 사용하고 이지 않다는 것을 스스로 확인하여야한다.

ios 는 입출력 상태 표시로 정수 변수이다. 명령이 성공적으로 수행되었다면 ios가 0이고 아니면 0이 아니 어떤 값이 된다.

err 는 오류가 발생하면 이동할 문장 번호이다.

fname 은 file이름을 나타내는 문자열이다.

sta는 문자열로 NEW, OLD 또는 SCRATCH 중의 하나이다. 이는 file의 이전 상태를 나타낸다. scrath file은 만들어지고 file이 닫히거나 프로그램이 끝나면 지워지는 file이다.

acc 는 SEQUENTIAL 또는 DIRECT이어야만 한다. 미리 설정한 값은 SEQUENTIAL이다.

frm 은 FORMATTED 또는 UNFORMATTED이고 미리 설정한 값은 UNFORMATTED이다.

rl 은 direct-access file의 record의 길이를 나타낸다.

이런 specifiers에 대하여 더 자세히 알거 싶으면 Fortran 77 책을 참조하라.

file을 연 뒤에 read 또는 write 명령을 사용한다. file에 관한 일을 다 마치면 다음 명령을 사용하여 닫아야 한다.

      close ([UNIT=]u[,IOSTAT=ios,ERR=err,STATUS=sta])
여늬 때와 마찬가지로 여기서 괄호 안의 변수는 선택적이다.

read와 write를 다시 한 번(Read and write revisited)

앞에서 다루었던 단순한 read/write 문에서 필요한 변화는 오직 장치 번호를 규정하여야 한다는 것이다. 그러나 보통 몇 가지를 더 규정하기를 원한다.
      read ([UNIT=]u, [FMT=]fmt, IOSTAT=ios, ERR=err, END=s)
      write([UNIT=]u, [FMT=]fmt, IOSTAT=ios, ERR=err, END=s)
대부분의 규정자는 앞에서 살펴 보았다. END=s는 file을 끝(end-of-file)에 다다르면 이동할 문장 번호를 나타낸다.

예제 (Example)

여러 점에서의 x, y, z 좌표가 적힌 data file이 있다. 점의 숫자는 첫 번쨰 줄에 적혀 있다. data file의 filename은 points.dat이다. 각가의 좌표의 형식은 F10.4이다. 다음은 3 개의 배열 x, y, z에 자료를 읽어 들이는 짧은 프로그램이다.
      program inpdat
c
c  This program reads n points from a data file and stores them in 
c  3 arrays x, y, z.
c
      integer nmax, u
      parameter (nmax=1000, u=20)
      real x(nmax), y(nmax), z(nmax)

c  Open the data file
      open (u, FILE='points.dat', STATUS='OLD')

c  Read the number of points
      read(u,*) n
      if (n.GT.nmax) then
         write(*,*) 'Error: n = ', n, 'is larger than nmax =', nmax
         goto 9999
      endif

c  Loop over the data points
      do 10 i= 1, n
         read(u,100) x(i), y(i), z(i)
   10 enddo
  100 format (3(F10.4))

c  Close the file
      close (u)

c  Now we should process the data somehow...
c  (missing part)

 9999 stop
      end

Exercises

Exercise A
위의 에제를 수정하여 입력 datafile에 오류가 있으면 정지하고 오류 설명을 보이는 프로그램을 작성하라.

Exercise B
위 연습 문제 A를 수정하여 새 file norms.dat 를 열어서 각각의 data 점 (x,y,z)의 2-norm(Euclidean norm)을 출력하는 프로그램을 작성하라. 첫 째 줄에는 점의 수 n을 적고 그 다음 각 줄에 부동 소숫점 숫자 2 개를 각각 12 글자 폭으로 인쇄한다. 작성한 프로그램을 이 data file로 검사한다.


[Fortran Tutorial]
충남대학교 물리학과 오 병성