0
 35   4   1
  View Articles

Name  
   손병목  (2002-02-27 19:50:56, Hit : 13247, Vote : 1311)
Homepage  
   http://www.itmembers.net
Subject  
   예제로 익히는 파일 시스템(2) - 랜덤 접근 파일(上)
계획대로 이번 시간에는 전전 강좌에 이어 파일 입출력 실습을 해보겠습니다.
이번 시간에는 랜덤 액세스(임의 접근) 파일에 대한 실습을 하는데 제가 알기로는 실무 활용율이 다소 떨어집니다.
대개 텍스트 파일의 입출력을 위해서는 이미 실습한 순차 접근 방식으로 파일을 처리하고, 오늘처럼 레코드 관리를 위해서는 DB를 이용하기 때문입니다.
그러나 일단 파일 입출력과 관련된 개념을 익히기 위해 랜덤 파일 처리에 대해 간단한 실습을 해보겠습니다.
간단한 실습이지만 설명할 것이 조금 있어서 2회로 나누어 설명을 하도록 하겠습니다.


먼저 이번 시간과 다음 시간에 걸쳐 실습하게 될 프로그램의 실행 모습입니다.

어떤 실습을 할지 감이 잡히시죠?

자, 아래와 같이 일단 한번 만들어 봅시다.
설명은 나중에 하기로 하구요.

  1. 비베를 '표준 EXE' 프로젝트로 실행합니다.

  2. 아래와 같이 폼을 만듭니다.

    • 레이블, 텍스트 박스, 커맨드 버튼 컨트롤을 위와 같이 배치합니다.
    • 속성을 다음과 같이 변경합니다.


  3. 코드 창을 열어 아래와 같이 코드를 작성합니다.

    [조회] 버튼에 대한 코드는 작성하지 않았습니다. 조회 버튼을 눌렀을 때의 기능에 대해서는 다음 시간에 다루기로 하겠습니다.

  4. 코드를 다 작성했으면 실행을 해야죠...(잘 되죠?)
    혹시 잘 안되면 ④번 중간 쯤에 Put #iFilename, , tPerson이라는 부분에서 쉼표를 두 번 쓰지 않았을 확률이 높은데...
    코드를 잘 살펴보세요. 그래도 안되면 아래 해설을 보시면서 하나하나 이해하면서 찾아보세요.


설명할 게 좀 많네요.
차근차근 설명을 하겠습니다.

먼저 위 코드 중에서 ①번 부분입니다.

Private Type usrPerson
    strName As String * 10
    strRegion As String * 10
    strContact As String * 13
End Type

새로운 데이터 형을 선언하는 것입니다. 잘 보시면 알겠지만 문자열 변수 세 개를 묶어서 하나의 데이터 형을 만든 것입니다.
strName, strRegion, strContact 문자열 변수의 길이가 각각 10, 10, 13입니다.
여기에 각각 이름, 지역, 연락처를 저장하기 위한 데이터 형을 만든 것입니다. 즉 이름, 지역, 연락처를 하나의 세트로 만들어 이것을 특별한 데이터 타입으로 선언한 것입니다.
이것이 레코드가 되는 것입니다.
레코드는 데이터베이스 용어인데, "손병목 서울 02-123-1234"라는 전체를 하나의 레코드라고 합니다.
그리고 이름, 지역, 연락처를 각각 필드 이름이라고 합니다.
예를 들어 전화번호부가 있다면, 이름, 주소, 전화번호 등의 항목으로 구성되는데 이것을 필드 이름이라고 하고
"김갑돌 서울시 종로구... 3322-1123"와 같이 김갑돌에 대한 주소와 전화번호를 통틀어 하나의 레코드라고 합니다.
전화번호부는 수천~수만개의 레코드로 구성되어 있는 셈이죠.


Dim iFileNum As Integer
Dim tPerson As usrPerson

iFileNum 변수에는 파일 번호가 들어갑니다. 이미 순차 파일 처리할 때 실습했듯이 파일을 열고 닫을 때는 반드시 파일 번호를 써 줘야 했습니다.
#1, #2와 같은 식으로 사용했는데, 이번 실습에서는 파일 번호를 변수로 처리하겠습니다. 만약 어떤 프로그램을 만들 때 여러 개의 파일을 다루어야 한다면 일일이 #1, #2...와 같이 코딩하기가 힘드니까 파일 번호를 저장하는 변수를 만든 다음 현재 사용하지 않는 파일 번호를 자동으로 대입하는 식으로 처리하고 있습니다. 아래에서 다시 설명합니다.
Dim tPerson As usrPerson : 위에서 새로운 usrPerson이라는 새로운 데이터 형을 만들었습니다. tPerson이라는 변수는 바로 usrPerson과 같은 데이터를 저장할 수 있는 변수가 되는 것입니다.

②번 부분을 살펴보죠.

Private Sub Form_Load()
    iFileNum = FreeFile ' 사용가능한 파일번호 자동 부여
    Open App.Path + "\cardfile.txt" For Random As iFileNum Len = Len(tPerson)
    ' App.Path는 현재 비베 파일이 저장된 위치
End Sub

랜덤 파일을 열 때는 다음과 같이 엽니다
Open 파일이름 For Random As 파일번호 레코드길이

FreeFile 명령은 현재 사용하지 않는 파일 번호를 돌려줍니다.
App.Path는 현재 경로를 말합니다. 즉 지금 폼을 만들어 저장하여 작업하고 있는 디렉토리를 나타냅니다.
For Random은 파일을 랜덤 형식으로 열겠다는 뜻이고,
Len()은 괄호 속의 데이터의 길이를 돌려줍니다.

너무 복잡한가요? 결국 아래와 같은 뜻입니다.
Open "c:\vb실습\cardfile.txt" For Random As #1 Len=33

③번은 폼을 닫을 때 열어 둔 파일을 닫으라는 뜻입니다.
설마 직접 Private Sub Form_Unload(Cancel As Integer)를 직접 입력하신 건 아니죠?
Form 개체를 선택하고 Unload 이벤트를 선택하면 됩니다.

마지막으로 ④번 부분을 살펴봅니다.
그냥 보시면 거의 이해가 되죠?
tPerson.strName과 같은 식으로 사용합니다.
tPerson은 세 개의 문자열 변수로 이루어진 데이터를 저장할 수 있는 변수입니다.
이 변수는 strName, strRegion, strContact 변수를 모두 포함하고 있으므로 각각의 변수를 지정할 때는 tPerson.strName 과 같은 식으로 지정해야 합니다.

Put 파일번호, 위치, 데이터 : 랜덤 파일은 이런 식으로 파일에 데이터를 기록합니다. Put 명령을 사용합니다.
23강에서 파일 처리와 관련된 명령을 정리한 도표가 기억 나나요?(기억 안나면 여기를 클릭해서 도표를 보세요...)
Put #iFileNum, , tPerson에서 iFileNum은 파일 번호를 저장한 변수이고,
두번째 매개변수는 생략하였습니다. 이렇게 생략하면 이전 데이터의 끝에 새로운 데이터를 기록한다는 뜻입니다.
정리하면, tPerson의 데이터를 현재 열려있는 파일의 끝에 기록한다는 뜻이 되겠죠.

txtName.Text = "" 는 텍스트 박스의 내용을 지우는 것입니다.
즉 현재 폼에서 [추가] 버튼을 눌러 데이터를 파일에 쓰고 난 다음에 텍스트 박스를 빈칸으로 만들라는 뜻입니다. 그래야 다른 데이터를 쓸 테니까요.

txtName.SetFocus 는 커서를 이름 입력 란에서 깜빡깜빡하라는 것입니다.

쉽게 설명하려고는 했지만 여전히 어렵게 느껴질 수 있습니다.
조금이라도 이해가 안되는 것이 있으면 질문 답변 게시판을 이용해 주시고, 이번 강좌와 관련된 소스는 자료실에 올려두겠습니다.

이상 동주 아빠 손병목이었습니다.

Prev
   예제로 익히는 파일 시스템(2) - 랜덤 접근 파일(下)

손병목
Next
   예제로 익히는 ActiveX컨트롤(6)-ProgressBar

손병목


Copyright 1999-2021 Zeroboard / skin by Zetyx