OpenU, OpenW, 그리고 Append 키워드

파일 입출력과 관련하여서 IDL은 세 가지의 Open 명령어가 있고, 이들에 대한 도움말의 설명은 아래와 같습니다.

The three OPEN procedures open a specified file for input and/or output.

  • OPENR (OPEN Read) opens an existing file for input only.
  • OPENW (OPEN Write) opens a new file for input and output. If the file exists, it is truncated and its old contents are destroyed.
  • OPENU (OPEN Update) opens an existing file for input and output.

일단, OpenR 은 간단합니다. 읽기만 가능한 것이고, 기존 파일을 고칠 수 없다는 의미입니다. 아래 예제들은 OpenW와 OpenU에 대한 비교들이며, 이들이 어떻게 다르게 사용되는지 확인하십시오.

1번 예제입니다.

abc.txt 파일을 메모장 등으로 열어 보세요. 위 예제에서는 openw 는 기본적으로 같은 이름의 파일이 있을 경우 덮어 쓴다는 것을 보입니다.  뒤에 다시 나오겠지만, 내용을 더 추가하고 싶다면 /APPEND 키워드를 사용해야 합니다.

2번 예제입니다.

abc.txt의 결과는 다음과 같습니다.

This is the 1st line.
overwrite the 2nd line.
is is the 3rd line.
This is the 4th line.

OpenU는 읽기/쓰기가 모두 가능합니다. 파일 내의 위치는 파일의 처음이 됩니다. OpenU 이후 프로시저들을 보면, 첫 줄을 읽고, 읽기 원칙 대로 파일 내의 위치는 두 번째 줄 처음으로 가 있습니다. 그 다음은 printf로 덮어쓰기를 하네요. 이제 파일 내의 포인터는 세번째 줄의 세번 째 문자 앞에 있습니다. ‘overwrite the 2nd line.’ 이 원래 문장이었던 ‘This is the 2nd line.’ 보다 두 글자 많기 때문에, 세번째 줄의 앞 두 글자를 덮어 씁니다. 그리고 또 한 줄을 읽으니 This is… 에서 Th가 빠진 나머지 부분을 읽습니다. 이제 파일의 끝으로 도달했고, 네번째 줄을 추가한 것입니다.

3번 예제입니다.

abc.txt 파일의 내용은 다음과 같습니다.

This is the 1st line.
This is the 2nd line.
This is the 3rd line.
This is the 4th line.

두 번째 나온 OpenW가 /APPEND 키워드와 함께 사용되었습니다. 그래서 1번 예제와 달리, 덮어쓰지 않고, 마지막에 이어서 내용을 추가할 수 있습니다.

4번 예제입니다.

def.txt 파일의 내용은 다음과 같습니다.

1. Append a line.
2. Append a line.
3. Append a line.

이 예제는 def.txt 파일이 존재하지 않는 상태에서 시작하는 것을 가정합니다. 즉, def.txt 파일이 존재하지 않는데 /APPEND 키워드를 써서 이어 쓰라고 하면 어떤 현상이 발생하는지 보고 싶은 것입니다. 다행히, 에러가 나지 않고, 새로 파일을 생성합니다. 즉, 4번 예제의 첫 OpenW는 /Append가 있으나 없으나 같은 상황입니다. 편한 쪽으로 해석하자면, 프로그래머가 ‘파일이 이미 존재할 경우 내용을 추가하고, 파일이 존재하지 않을 경우라면 새로 파일을 생성하라’는 의도를 가질 때, 굳이 IF 문을 써서 파일의 존재유무를 체크할 필요는 없다는 것입니다. 연속적인 로그 같은 것을 남기는 프로그램을 만들 때 유용합니다. 마지막 문단은 의도적으로 OpenU를 사용해 보았습니다. 즉, OpenU, /APPEND의 조합은 OpenW, /APPEND의 조합과 사실상 차이가 없음을 보여 줍니다.

5번 예제입니다.

도움말에 보면 OpenW 명령으로 파일을 열었을 때 쓰기는 물론 읽기도 가능하다고 되어 있습니다. 굳이 파일 읽기를 하려고 할 때 OpenW (Write의 W인데 말이죠)를 쓸 필요는 없다고 생각됩니다. 헷갈립니다. 하지 마세요. 그렇지만 도움말에 읽기/쓰기가 모두 가능하다고 되어 있어 시도해 보는 것입니다. OpenW를 /APPEND 키워드와 함께 쓰면 파일의 끝 부분으로 위치하기 때문에 읽을 게 없고, /APPEND 키워드 없이 쓰면 존재하는 파일을 지우고 새로 쓰기 때문에 읽을 게 없습니다. 아무래도 읽기용 명령어는 아니예요. 그렇지만 굳이 POINT_LUN 이라는 명령어를 써서 0번 위치(처음)로 옮겨가면, OpenU로 파일을 열었을 때와 같은 상황이 됩니다. 위 예제에서 보듯이 OpenW로도 읽기가 됨을 볼 수 있습니다.

정리해보면 다음과 같습니다.

  • openW : 기존파일 존재 시 덮어씀. 새 파일 만들기 용도.
  • openU : 파일이 존재하지 않을 경우 에러 발생. 파일 처음으로 포인터(전축 바늘 같은 거라고 생각하세요) 위치함.
  • openW, /APPEND : 기존 파일 존재할 경우 이어 씀. 파일의 끝으로 포인터 위치함. 존재하지 않는 파일인 경우 새 파일 생성.
  • openU, /APPEND : 파일이 존재하지 않을 경우 에러 발생. 파일의 끝으로 포인터 위치함.  기존 파일이 존재하는 경우 사실상 openW, /APPEND와 같음.

지속적인 로그를 남기는 프로그램을 만들 때 로그를 이어 쓰는 방법에 대한 문의가 있었습니다.OpenW, /APPEND 조합이 정답입니다.

도움말을 살펴보니 OpenU와 OpenW가 모두 read/write가 된다고 나와 있습니다. 그래서 OpenU와 OpenW는 키워드와 Point_Lun 을 통해 서로 같은 상황을 만들 수 있다는 것을 재미 삼아 확인해 보았습니다. 그렇지만, 스스로 헷갈릴 일을 만들 필요는 없습니다. 읽기/쓰기 다 하고자 하는 경우는 Update의 의미를 가진 OpenU를 사용하고, 쓰기를 하고자 하는 경우에는 OpenW (Write)를 사용하세요.