vb :: open문을
이용한 파일처리 _순차처리 파일 역시 디스크상에 관련된 일련의 바이트로 구성된 것에 지나지 않기 때문에, 어플리케이션에서 파일에 접근할
때는 이들 바이트가 어떻게 구성되었는가를 (문자, 데이터 레코드, 정수, 문자열 등등)미리 알고 있어야 한다. 파일이 어떤 데이터를 갖고
있느냐에 따라서 적당한 파일액세스형식을 사용해야 한다. 비주얼베이직에는 다음과 같은 3가지형식의 파일액세스가 가능하다.
-
순차처리(Sequential Access) 이 방식은 평범한 텍스트파일을 처리하는데 사용된다. 파일의 각 문자는 개행문자(newline
character)와 함께 텍스트의 문자나 텍스트 형식과 순서를 나타내는 것으로 가정한다. 또한 데이터는 ansi문자로 지정된다.
-
랜덤처리(Random Access) 이 방식은 고정길이의 레코드로 구성된 텍스트나 이진 파일을 읽고 작성할 때 사용한다. 파일은 레코드로
구성되어 있기 때문에, 하나의 레코드는 사용자 정의 데이터형(type .. end type)을 사용하여, 다른 데이터형을 갖는 여러개의 필드로
구성된 레코드를 만들 수 있다.
-
이진처리(Binary Access) 이 방식은 임의로 구조화된 파일을 읽고 작성할 때 사용한다. 이진처리의 장점은 파일을 사용하여 원하는
데이터를 저장할 수 있다. 이것은 랜덤액세스와 비슷하지만 데이터형식이나 레코드길이를 지정해 줄 필요가 없다. 그러나, 정확하게 저장된
데이터내용을 꺼내오려면 어떤 방식으로 데이터가 파일에 저장되었는지 알고 있어야 한다.
#순차처리 순차처리는
전형적인 텍스트에디터로 만들어진 파일. 즉, 순처적 데이터로서 오직 문자로만 된 파일을 프로세스할 때 가장 적당하다. 순차처리는 긴 숫자를
저장하는 데는 별로 효율적이지 못하다. 왜냐하면, 숫자들의 각 숫자는 문자열로 저장되기 때문이다. 예를 들어, 4자리 숫자를 저장하는 데 있어
이진파일의 정수형태로 저장하면 2바이트가 소모되지만, 순차처리파일은 모두 문자로 저장되기 때문에 총 4바이트가 소요된다. 그렇기 때문에
어플리케이션의 데이터를 처리하는 데는 그다지 효율적이지 못하다. 즉, 순차처리는 일반텍스트 문서파일을 처리할 때 유용하게 사용된다.
#순차파일
처리예제 순차파일처리를 어떻게 하는가를 알아보기위해 일단 다음과정을 따라 예제를 테스트해 본다.
1] [내문서]폴더에
다음과 같은 텍스트파일을 만든다.
2] 폼에 다음과 같은 메뉴를 생성한다. caption : 파일 name : mnuFile └ caption :
파일열기 └ name : mnuOpen
소스코드Private Sub mnuOpen_Click() Dim fileName, linesFromFile,
nextLine As String Dim fileNum As Integer
fileName =
"c:\my documents\sequence.txt" fileNum = FreeFile 'freeFile함수로 사용할 수
있는 파일번호를 구함
Open fileName For Input As fileNum
Do
Until EOF(fileNum) 'EOF함수로 파일의 끝을 알 수 있다. Line Input #fileNum,
nextLine '한번에 한행씩 텍스트파일의 내용을 읽는다. linesFromFile = linesFromFile +
nextLine + Chr(13) + Chr(10) Loop
Close fileNum
Debug.Print linesFromFile '직접실행창에 출력된다. End Sub
#파일열기와 닫기 순차처리를 위해 파일을 열 때는 다음과 같은 open구문이 사용된다. |형식| Open
pathname For [input | output | append] as filenumber [Len=buffersize] -
pathname :: 열고자하는 경로명과 파일명을 적어준다. - [input | output | append] :: 순차파일을 열 때 쓰는
모드로, 이중에서 한 모드를 써야한다. └ input(파일읽기 전용모드) :: input으로 순차파일을 열면 해당파일의 텍스트를 읽기만
할 수 있다. 이때 파일은 존재하고 있어야 한다. 그렇지 않으면 오류가 발생한다. └ output(파일쓰기 전용모드) ::
output으로 순차파일을 열면, 해당파일에 텍스트를 쓰기만 할 수 있다. 이 때 디스크상에 파일이 없다면 open문은 자동적으로 파일을
생성해놓고 나서 파일을 연다. 그러나, 디스크상에 파일이 존재한다면 해당파일의 내용은 모두 사라지게 된다. └ append(파일
덧붙이기모드) :: append로 순차파일을 열면, 해당파일의 끝에 텍스트를 덧붙일 수 있다. 이 때 디스크상에 파일이 없다면,
output모드와 마찬가지로 파일을 생성한 다음에 파일을 열게 된다. 그러나 output모드와는 달리, 이미 디스크상에 파일이 있어도 해당파일의
내용은 그대로 보존된다. - filenumber :: 파일에 접근하는데 사용되는 정수로서, 다른 파일에서 사용되지 않는 고유한 숫자로 적어
넣어준다. 사용할 수 있는 파일번호를 구하려면 freeFile함수를 사용하면 된다. freeFile함수는 Open 문에 사용할 수 있는 다음
파일 번호를 나타내는 Integer값을 반환한다. - bufferSize :: 파일과 사용자 프로그램간에 데이터를 복사할 때 버퍼의
문자수를 지정한다. 일반적으로 순차파일에서는 사용하지 않는다.
현재 열린 파일을 다른
모드로 사용하기 위해서는 반드시 close문을 사용하여 닫아야 한다. |형식| close [#]fileNum
#파일에서
문자열읽기 디스크에서 텍스트파일의 내용을 가져와서 프로그램 내의 변수에 저장하기 위해서는 input모드로 파일을 열고, line input
#뮨, input문, 혹은 input함수를 사용한다.
|형식| line
input #문 line input #문을 이용해 한 번에 한 행씩 순차파일의 내용을 읽었다. 그 예문에서 사용한 구문을 정리하면 다음과
같다. |형식| line input #fileNumber, 변수명 이 구문을 사용하기 위해서는 파일의 끝을 알아야하는데, 여기서는
파일의 끝을 알기위해 EOF(End of File)함수를 사용했다. EOF함수는 파일의 끝을 만나면 true를 반환한다. 또 line input
#문에서는 한 행의 끝을 캐리지리턴(chr(13))이나 캐리지리턴+라인피드(chr(13) + chr(10))문자를 만나면 한 행의 끝으로
인식한다. 그러나 그 변수에는 캐리지리턴과 라인피드가 저장되지 않기때문에 다른 변수에 저장하고 강제로 캐리지리턴을 넣어주어야 본래의 내용을
읽어들일 수 있다. 만약 이 작업을 하지않으면 연속해서 텍스트가 보일 것이다.
#input함수 input함수를
사용하면 지정한 바이트 수만큼 파일의 내용을 읽어 올 수 있다. |형식| input(바이트 수, fileNumber) 바이트
수에는 파일에서 몇 바이트의 크기를 읽어올 것인가를 지정한다. 이때 바이트 수는 65535보다 작아야 한다. 만약 파일전체를 읽고싶다면
LOF함수를 사용하면 된다. 위의 예제를 line input #문 대신 input문으로 변경시키면 다음과 같이 쓸 수 있다.
LOF함수는 파일의 크기를
byte단위로 반환한다. 영문은 한 글자당 1byte를 사용하므로 문자수와 파일크기가 동일하지만 한글은 글자당 2byte를 사용하므로 위의
예제로 한글텍스트를 읽어들이는 것은 고려해야 한다.
#input #문 파일에 작성된 문자열 표현식과 숫자의 목록을 읽는 input #문을 사용할 수 있다. 이 문은 주로 랜덤파일이나
이진파일에 사용된다. 예를 들면, 다음과 같이 input문을 사용하여 우편물 목록파일을 라인으로 읽을 수 있다. |형식| input
#fileNum, name, street, city, state, zip
#파일에 문자열
기록 output 또는 append모드로 파일을 열고, 그 다음 print #문을 사용하면 변수의 내용을 저장할 수 있다. 랜덤처리나,
이진처리에서는 주로 write #문이 사용된다. |형식| print #fileNum, [데이터 내용[; |
,]] fileNum앞에는 반드시 #이 필요하다. 데이터 내용에는 파일에 저장할 데이터를 지정한다. 숫자나 문자나 상관없으며, 데이터내용을
연속으로 쓸 수 있다. 그 경우에는 콤마(,) 혹은 세미콜론(;)으로 구분해 주어야 한다. 세미콜론(;)을 쓰게되면 다음 문자는 마지막 문자
바로 뒤에 붙게된다.