달력

122024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

random 파일처리

VB & .NET 2008. 5. 15. 09:04

vb :: 랜덤(random) 파일처리
 
#랜덤파일 레코드의 정의
랜덤처리는 고정된 길이의 레코드(각 레코드는 필드로 구성됨)로 구성되어 있는 파일을 처리할 때 유용하다. 랜덤처리는 필요로 하는 특정데이터의 위치를 찾아서 데이터를 읽을 수 있으므로 순차파일 처리보다는 데이터베이스처럼 작업을 할 수 있다. 또한 파일의 특정위치만 읽기때문에 순차처리보다 빠르다.
 
#랜덤데이터의 입력
일단 랜덤파일을 만들기 전에 고정된 길이의 레코드를 구성하기 위해서는 사용자정의 데이터형인 type .. end type문을 써야 한다. 이 사용자정의 데이터형은 반드시 코드모듈에 있어야 한다.
[1] 프로젝트 탐색기에서 모듈을 추가하여 해당코드모듈창에 코드를 입력한다.
[2] 사용자정의 데이터형을 만들고 사용자정의 데이터형을 전역변수로 선언한다.
소스코드Type person                     '사용자정의 데이터형 정의
    number As Integer       '2바이트 길이의 number(학번) 필드정의
    name As String * 10     '10바이트 길이의 name(이름) 필드정의
    mark As Integer           '2바이트 길이의 mark(점수) 필드정의
End Type
Public student As person             '전역변수 선언
person데이터형은 총 14바이트(number(2) + name(10) + mark(2))의 길이로 구성된다.

[3] 폼에 commandButton을 추가하고 코드를 입력한다.
name:cmdAddRecord
caption:레코드 추가
소스코드Private Sub cmdAddRecord_Click()
    Dim fileNum As Integer
    Dim recordLen As Long
    fileNum = FreeFile
    recordLen = Len(student)        'Len함수는 변수의 길이를 반환한다.
   
    Open "c:\my documents\random.dat" For Random As fileNum Len = recordLen
   
    student.number = 1
    student.name = "visual"
    student.mark = 99
    Put #fileNum, 1, student          'put문으로 레코드데이터를 랜덤파일에 저장
   
    student.number = 2
    student.name = "basic"
    student.mark = 98
    Put #fileNum, 2, student
   
    Close #fileNum
End Sub

랜덤처리를 위해 파일을 열 때는 open문을 쓰고, 반드시 close문을 사용하여 닫아야 한다. 랜덤처리를 위한 open문은 다음과 같다.
  |형식| open filepath for random as filenumber len=recordsize
filepath인수에는 해당파일이 있는 파일경로와 파일명을 써준다. 만약 파일이 존재하지 않으면 자동적으로 만들고나서 다음을 수행하게 된다. 랜덤처리를 위해서 반드시 open문 마지막에 사용할 레코드길이를 지정해야 한다. len(변수명)함수를 이용하면 그 변수의 길이를 알 수 있다.
 사용자가 정의한 데이터형(레코드) 변수(student)의 각 필드에 값을 할당하기 위해서는 [변수명.요소 = 값]형태를 사용했다. 만약 어떤 요소에 값 할당이 생략되면 null값이 들어가게 된다. 또한 정의한 데이터형보다 길면 잘라버리게 되고, 짧으면 공백으로 채우게 된다.
 
마지막으로 레코드데이터를 프로그램의 변수에서 랜덤파일로 저장하려면 다음과 같은 put문을 사용한다.
  |형식| put [#]파일번호, [레코드위치], 변수명
[레코드위치]는 디스크에 저장할 레코드위치를 지정하는 인수이고, 사용할 수 있는 가장 큰 레코드 번호는 2,147,483,647이다. 레코드 번호를 생략하게 되면 현재레코드의 다음 레코드위치에 저장된다. 생략을 하려면 반드시 콤마(,)를 지정해야 한다. 위의 예문에서는 첫번째 위치와 두번째 위치에 두개의 레코드가 저장된다.
만약 레코드위치를 순서대로 지정하지 않고 건너뛰어 지정한다면, 그 사이의 레코드 각 필드에는 쓰레기값이 저장된다.

 
#랜덤데이터 읽기
위에서 작성한 랜덤파일의 레코드를 읽기위해서는 get문을 사용해야 한다. 랜덤파일작성과 마찬가지로 랜덤파일에 있는 레코드를 읽기 위해선 먼저 사용자정의 데이터형을 코드모듈에 정의해야 한다. 그리고나서 get문을 사용하면 레코드를 변수에 복사할 수 있다.
다음 코드는 사용자정의 데이터형의 변수에 레코드의 각 필드를 읽기위한 예제를 나타내고 있다.

소스코드Private Sub cmdReadRecord_Click()
    Dim filenum As Integer
    Dim recordLen As Long
    Static recordNum
   
    filenum = FreeFile
    recordLen = Len(student)
   
    Open "c:\my documents\random.dat" For Random As filenum Len = recordLen
   
    Do Until EOF(filenum)       '엑세스한 파일의 끝에 도달할 때까지 false반환
        recordNum = recordNum + 1
        Get #filenum, recordNum, student        'get함수를 이용해 특정레코드를 읽는다.
        Debug.Print student.number; ; student.name; ; student.mark
    Loop
   
    Close #filenum
End Sub

get문을 구성을 정리하면 다음과 같다.
  |형식| get [#]파일번호, [레코드위치], 변수명
레코드 위치는 디스크에서 읽어야 할 레코드번호를 지정한다. 레코드번호를 생략하면 다음 레코드 위치를 갖는 레코드를 읽게된다. 이때에도 콤마(,)를 지정해야 한다.

랜덤파일에서 특정레코드를 찾으려면 다음과 같은 seek문을 사용하면 된다.
  |형식| seek [#]파일번호, 레코드위치

#레코드 삭제
레코드의 필드를 지우면 레코드를 삭제할 수 있지만 레코드는 계속 파일에 남아있게 된다. 그러나 여러분들은 공간을 낭비하거나 순차동작으로 방해받고 싶어하지 않기 때문에 보통 파일에 빈 레코드를 남겨두고 싶지 않을 것이다. 이때에는 새 파일에 남은 레코드를 복사한 다음, 원래 파일을 삭제하는 것이 좋다. 랜덤액세스 파일의 삭제된 레코드를 없애려면 다음 순서를 따르면 된다.
1] 새 파일을 만들어 원래 파일의 모든 유효한 레코드를 새 파일에 복사한다.
2] 원래 파일을 닫고 kill문을 사용하여 삭제한다.
3] name문을 사용하여 원래 파일의 이름으로 새 파일의 이름을 바꾼다.
random처리는 일정한 레코드로 구성된 파일에 적용해야 그 유용성이 나타난다. 그러나 대부분의 파일들은 레코드와 같은 일정한 패턴의 길이를 가지고 있지 않다. 이러한 종류의 파일은 이진(binary)처리를 사용하면 좀 더 융통성있게 처리할 수 있다.
 

'VB & .NET' 카테고리의 다른 글

ADO.Net DB연결과 사용법  (0) 2009.03.08
ADO.NET 표준사례  (0) 2009.03.08
[함수] Len, Left, Mid, Right - 문자열 자르기  (0) 2008.10.15
Posted by 알 수 없는 사용자
|