지난 호에서는 OPEN문을 사용하는 이유 및 간단한 문법 사항을 알아보았습니다.
요번 호에서는 이 내용에 대해서 좀 더 심도 깊게 살펴보도록 하겠습니다.
OPEN문의 형식은 다음과 같습니다.
OPEN( UNIT = 정수,
FILE = 문자,
ACCESS = 문자,
STATUS = 문자,
FORM = 문자,
IOSTAT = 정수형 변수,
RECL = 정수,
ERR = 문번호
END = 문번호 )
보시는 바와 같이 생각보다 많은 옵션을 가지고 있습니다. 그렇다고 다 사용하는 것은 아니지만 ....
이 중에서 가장 기본적인 것은 'UNIT'과 'FILE' 입니다.
(1) UNIT(장치번호 : unit number )
READ나 WRITE문에서 사용될 파일을 정의하기 위해서 사용합니다. 그 예는 다음과 같습니다.
예제 1)
OPEN(UNIT=11, FILE='SAMPLE.TXT' )
....
READ(11,*) AN, BN, CN
보시는 바와 같이 'UNIT=정수'라고 정의하고 READ나 WRITE문에서 그 번호를 사용하면 됩니다.
예제 2)
위의 예문에서 'UNIT='을 생략하여도 동일한 효과를 얻을 수 있습니다.
OPEN(11, FILE='SAMPLE.TXT' )
예제 3)
장치 번호를 직접 숫자로 입력하여도 좋지만 이렇게 되면 혼돈되는 경우도 있기 때문에 변수로
정의하여 주는 것이 복잡한 프로그램에서는 더욱 효율적입니다.
INTEGER MINP, MOUT1, MOUT2, MOUT3
.....
MINP = 11
MOUT1 = 21
MOUT2 = 22
MOUT3 = 23
C
OPEN(MINP, FILE='SAMPLE.TXT' )
OPEN(MOUT1, FILE='T1')
OPEN(MOUT2, FILE='T2')
OPEN(MOUT3, FILE='T3')
.....
CALL READ_DAT( MINP, .... )
CALL WRIT_DAT_1( MOUT1, .... )
CALL WRIT_DAT_2( MOUT2, MOUT3, ... )
.....
SUBROUTINE READ_DAT( MINP, ....
....
READ(MINP,*) .....
보시는 바와 같이 하면 여러개의 파일을 동시에 열더라도 혼란이 작아집니다.
그리고, MINP이라는 변수를 SUBROUTINE으로 넘길 때 COMMON등을 사용해도 되지만
보시는 바와 같이 ARGUMENT로 넘기는 것을 추천합니다.
왜냐하면 메일 프로그램에서 CALL 되는 부분만 보아도 어떤 파일과 관련되는 작업이
여기서 진행되는구나 하는 것을 파악하기 쉽기 때문에 readability가 화~~ㄱ 좋아지고
실수를 할 가능성이 작아집니다.
또한, ARGUMENT로 넘길 때, IN/OUT의 장치 번호는 매 앞에 써 주는 것이 좋습니다.
참고로, 장치 번호를 정의할 때, INPUT과 관련해서는 10~19번을, OUTPUT과 관련해서는
20~29번을 SCRATCH FILE과 관련해서는 70~79 번과 같이 나름대로 법칙을 정해서
사용하는 것이 실수를 줄일 수 있는 방법이기도 합니다.
(2) FILE(파일이름)
READ나 WRITE문에서 사용될 파일을 이름을 정의하기 위해서 사용합니다. 별다른 예외사항은
없습니다.
(3) STATUS
초보자 여러분들이나 보통은 잘 사용하지 않는 것입니다만, 파일 OPEN시 반드시 정의를 해 주는
것이 좋습니다. STATUS는 4가지가 있습니다. 'NEW' 'OLD' 'UNKNOWN' 'SCRATCH'
그 예는 다음과 같습니다.
예제 1)
OPEN(UNIT=11, FILE='SAMPLE.TXT', STATUS='OLD' )
....
READ(11,*) AN, BN, CN
보시는 바와 같이 STATUS='OLD' 로 선언을 하면 이미 존재하는 파일이라는 의미를 갖습니다.
따라서, READ 문이 이 파일에 엑세스할 수 있게 되지요. 그런데, 위의 문장에서 STATUS='NEW'
바꾸면 새롭게 생성되어야 하는 파일을 의미하므로 READ시 에러가 발생하게 됩니다.
어떤 경우에 사용하나구요? ---> READ시 파일이 존재하지 않아서 에러가 발생하는 경우를
막기 위해서 사용합니다.
예제 2)
OPEN(UNIT=11, FILE='SAMPLE.TXT', STATUS='NEW' )
....
WRITE(11,*) AN, BN, CN
STATUS='NEW' 라고 정의하면 새롭게 파일을 생성하는 경우에 사용됩니다. 사실 OUTPUT을
정의할 때는 매우 유용한 정의입니다. 예를 들어, 한 번 해석을 수행하여 OUTPUT을 만들고,
조건을 달리하여 또 해석을 수행할 때, STATUS='NEW' 가 정의되어 있지 않으면 덮어쓰기를
하게 됩니다. 그러면, 지난 번에 수행한 결과는 ... 당연히 날라가지요.
그런데, 한 번 해석 수행하는 데 40시간이 소요되었다면 ..... -> 미침다.
이럴 때, 이 옵션을 사용하면 프로그램이 FILE에 대한 이름을 찾아서 존재하는 파일이면
에러 메세지를 내고 정지를 하게 됩니다. 이럴 때 아주 유용하게 사용할 수 있습니다.
예제 3)
OPEN(UNIT=11, FILE='SAMPLE.TXT', STATUS='UNKNOWN' )
이 경우에 파일이 존재하면 STATUS='OLD'가 되고 그런 파일이 없으면 STATUS='NEW' 로
프로그램이 자동 설정하게 됩니다. STATUS에 대해서 정의하지 않으면 STATUS='UNKNOWN'
인 것으로 인식을 하게 됩니다.
따라서,
OPEN(UNIT=11, FILE='SAMPLE.TXT')
은 위의 문장과 같은 의미를 갖게 됩니다.
요번에는 OPEN문의 기초를 알아보았는 데 다음에는 다른 옵션을 사용하여 좀 더 파워풀한 프로그램을
할 수 있는 쪽으로 알아보도록 하겠습니다.
댓글
댓글 리스트-
작성자경제운 작성시간 07.02.01 초보자들이 궁금한 사항을 알기 쉽게 잘 설명해주 셨네요. 감사합니다. 혹시 연재하실 목차를 미리 알려주시면 제가 공지사항에 올려놓도록 하겠습니다. 그러면 초보자 및 궁금하신분들께 더욱 많은도움이 될듯합니다. 감사합니다.
-
작성자불꽃남자 작성시간 07.02.01 고맙습니다. 초보인 저에게 많은 도움이 되는거 같습니다. 항상 고맙게 읽고 있습니다. 건강하시고 감기 조심하시길...
-
작성자whitepeach 작성시간 07.02.02 정말 감사합니다. 많은 도움이 되고 있습니다.^^
-
작성자곽수빈 작성시간 18.08.01 좋은 글 감사합니다.