440 likes | 753 Views
Computer 3(Visual Basic). 파일처리. 파일 접근 형식. 순차 접근 (Sequential Access) - 가장 간단한 파일 형식 - 느리고 , 불필요한 작업을 수행 임의 접근 (Random Access) - 좀 더 빠르고 유용한 방식 - 순차 파일보단 훨씬 복잡 이진 접근 (Binary Access) - 특별한 임의 접근방식의 압축된 형식. Open 문. 순차 파일과 임의 파일은 모두 사용. 형식 :
E N D
파일 접근 형식 • 순차 접근(Sequential Access) - 가장 간단한 파일 형식 - 느리고, 불필요한 작업을 수행 • 임의 접근(Random Access) - 좀 더 빠르고 유용한 방식 - 순차 파일보단 훨씬 복잡 • 이진 접근(Binary Access) - 특별한 임의 접근방식의 압축된 형식
Open문 순차 파일과 임의 파일은 모두 사용 • 형식: • Open “파일명”[모드] As #파일번호 Open “finput.txt” For Input As #1 Open “fappend.txt” For Append As #2 Open “foutput.txt” For Output As #3 Open “frandom.txt” For Random As #4
Close문 Open문으로 열어놓은 파일을 닫기 위한 명령 • 형식: • Close #파일번호 Close Close #2
순차 접근(Sequential Access) 파일 - 처음부터 끝까지 순서대로 읽고 쓰는 파일 기록할 파일 번호 • Print #문 Print #intFileNum, [OutputList]
Input #문 순차적 데이터를 읽을 때 사용 Input #파일번호, 변수 • Write #문 순차 파일에 데이터를 기록하는 명령 Write #파일번호, [OutputList]
예 Input, Output, Append 3가지 모드를 함께 사용하여 파일을 입력, 출력, 추가할 수 있는 파일처리 프로그램을 만든다.
1 • 폼 클릭, 속성에서 (이름)을 FrmsequentialFile, Caption을 순차파일을 이용한 예제라 한다. • 도구(T)메뉴 메뉴편집기(M)를 선택한다. 실행결과 파일메뉴와 하위항목 속성 지정
2 도구상자에서 마우스 오른쪽버턴 클릭 구성요소(O) Microsoft Windows Common Controls 6.0과 Microsoft Windows Common Contros-3 6.0을 클릭(다음과 같이 된다.) ToolBar ImageList CoolBar
ToolBar 컨트롤을 더블클릭, 속성에서 (이름)을 Tbrtoolbar, (사용자 정의) 속성을 클릭한다. • 속성페이지에서 단추텝 클릭 단추삽입 클릭
도구모음에 각 아이콘 삽입하기 다음과 같이 각각 설정한 후 단추삽입버턴 클릭, 모두 설정되면 확인 버턴을 클릭한다. 실행결과
CoolBar로 시각적 모양 아이콘 만들기 • CoolBar컨트롤을 더블 클릭하여 폼위에 배치한다. • 배치된 ToolBar컨트롤을 선택하여 잘라내기한다. • 마우스를 CoolBar컨트롤에 이동시킨 후 붙여넣기한다. • 폼위에 텍스트박스와 상태표시줄인 StatusBar 컨트롤을 다음과 같이 배치한다.
텍스트박스 속성을 다음과 같이 설정한다. • Status속성을 다음과 같이 설정한다. • 상태표시줄에 마우스 이동, 오른쪽버턴 클릭, 속성(R) 패널 패널삽입을 클릭한 후 다음처럼 설정한다.
메뉴에 공통대화상자 넣기 • 프로젝트(P) 구성요소(O) Microsoft Common Dialog Control 6.0을 클릭 • 도구상자에 추가된 Commondialog컨트롤을 더블 클릭하여 폼에 배치 폼에 배치된 Commondialog 컨트롤, 프로그램 실행시에는 나타나지 않는다. • Commondialog 컨트롤에 대한 속성을 다음처럼 설정한다.
3 • 폼을 더블 클릭하여 코딩한다. • 코드창에서 (일반)과 (선언)으로 바꾼 후 Option Explicit로 입력한다. • 각 단위 모듈에서 반복적으로 사용되는 변수들을 다음처럼 코딩한다. 각 컨트롤에 대한 코드 작성하기 프로시저창에서 각각의 컨트롤에 대한 코딩을 한다. 각 컨트롤을 더블 클릭한 후 코드창에서 코딩한다.
Private Sub mnunew_Click( ) newproc End Sub Private Sub mnuopen_Click( ) openproc End Sub • Mnunew, mnuopen, mnusave, mnuappend를 선택한 후 각각 코딩한다. Private Sub mnusave_Click( ) saveproc End Sub Private Sub mnuAppend_Click( ) appendproc End Sub • 각 프로시저(newproc, openproc, saveproc, appendproc) 작성하기. • 도구(T)메뉴 프로시저 추가(P)클릭 후 다음처럼 선택 프로시저명 입력① 확인버턴 선택③ 형식을 Sub, 범위를 Public ②
Public Sub newproc( ) If Txtdisplay.Text < > “ ” Then response = MsgBox(“현재의 파일내용을 저장 할까요?”, vbQuestion + vbYesNoCancel, “확인”) If response =vbYes Then ComDialog.FileName = “ ” ComDialog.ShowSave fname = ComDialog.FileName fnum = FreeFile Open fname for Output As #fnum Write #fnum, Txtdisplay.Text Close #fnum ElseIf response = vbNo Then Txtdisplay.Text = “ ” End If End If End Sub 텍스트박스에 입력된 데이터가 있으면 대화상자 출력① • Newproc 프로시저의 코딩내용 대화상자에서 예를 선택하면 공통대화상자에서 파일명을 삭제하고 저장할 공통대화상자를 화면에 나타내고 저장할 파일명을 fname으로 가져온다. 저장할 파일(fname)에 데이터가 있으면 파일을 열기 위해 파일번호를 FreeFile함수에서 얻는다.(이때는 #1, #2등의 수를 이용해도 된다.) 파일을 저장하기 위해 Output모드로 연 후 텍스트박스에 있는 데이터를 파일에 쓰기를 한 후 닫는다. 텍스트박스에 있는 데이터를 저장하지 않으려고 대화상자 메시지에서 아니오를 선택하면 텍스트박스 내용이 삭제된다.
새 파일 열기 실행시 텍스트박스에 데이터가 있을 때 새 파일을 선택시 ① • Openproc 프로시저의 코딩내용
Public Sub openproc( ) On Error GoTo error1 ComDialog.FileName = “ ” ComDialog.Filter = “All Files (*.*)|*.*|Text Files (*.txt)|*.txt|batch files (*.bat)|*.bat” ComDialog.ShowOpen fname = ComDialog.FileName If fname < > “ ” Then fnum = FreeFile Open fname For Input As #fnum Do Until EOF(1) Line Input #fnum, txtline readdata = readdata + txtline + Chr$(13) + Chr$(10) Loop Txtdisplay.Text = readdata Close #fnum End If Exit Sub error1 : MsgBox “취소버턴을 클릭하였습니다.” End Sub 열기 공통대화상자에서 취소버턴을 누르면 메시지를 나타낸다. 열기상자에서 파일입력을 위해 기존 파일명을 삭제하고 파일형식을 All Files로 출력① 열기 공통대화상자를 나타내며 선택한 파일명을 가져온다. 파일 데이터가 있으면 FreeFile함수를 이용하여 파일번호를 fname으로 가져온다. 파일을 Input모드로 연 후 Do - Until 구조를 이용하여 파일의 데이터를 readdata변수에 저장한다. Vccr + vbIf로 사용해도 된다. 저장된 파일내용을 텍스트박스에 보낸다.
파일형식을 All Files로 나타냄 파일열기 또는 파일열기 아이콘 선택시 취소버턴 선택시
Saveproc 프로시저 코딩내용 Public Sub saveproc( ) ComDialog.FileName = “ ” ComDialog.ShowSave fname = ComDialog.FileName If fname < > “ ” Then fnum = FreeFile Open fname For Output As #fnum Print #fnum, Txtdisplay.Text Close #fnum End If End Sub 공통 저장 대화상자내의 파일이름란에 있는 기존 파일명을 삭제한 후 저장 상자를 나타낸다.① 저장할 파일명을 fname로 가져온다. 저장할 파일 데이터가 있으면 freeFile함수를 이용하여 파일번호를 가져온다. Output모드로 파일을 연 후 파일 내용을 저장한다. 이곳에 저장할 파일명을 입력한다.① • Newproc 프로시저의 코딩내용
Public Sub appendproc( ) On Error GoTo error2 ComDialog.FileName = “ ” ComDialog.ShowOpen fname = ComDialog.FileName If fname < > “ ” Then data = Txtdisplay.Text fnum = FreeFile Open fname For Append As #fnum Do Until EOF(1) Line Input #fnum, txtline readdata = readdata + txtline +Chr$(13) + Chr$(10) Loop Txtdisplay.Text = data + readdata Close #fnum Exit Sub error2 : MsgBox “취소버턴을 클릭하였습니다.” End If End Sub 공통대화상자내의 파일이름란의 기존 파일명을 삭제하고 공통대화상자를 연다.① 공통대화상자의 취소버턴을 누르면 메시지를 출력한다. 열기할 파일명을 fname로 가져온다. Fname에 기존의 내용이 있으면 data변수에 텍스트박스의 내용을 저장한 후 FreeFile 함수를 사용하여 파일번호를 fnum에 가져온다. 파일을 Append모드로 연 후 파일의 끝까지 읽어서 저장한다. Vbcr + vbIf로 코딩해도 된다.
① 취소버턴 메시지
도구모음 내의 3개의 아이콘에 대한 코딩은 도구모음에서 더블 클릭 후 다음처럼 코딩 Private Sub thrToolbar_ButtonClick(Byval Button As MSComctlLib.Button) If Button.Key = “open” Then openproc ElseIf Button.Key = “save” Then saveproc ElseIf Button.Key = “append” Then appendproc End If End Sub 도구모음 내의 열기아이콘 선택시 나타나는 풍선메뉴 Private Sub mnuexit_Click( ) Beep End End Sub • 프로그램 종료를 위한 코딩
임의 접근(Random Access) 파일 - 파일내의 특정 위치로 직접 찾아갈 수 있는 파일 - 동일한 크기의 레코드 단위로 저장한 다음 데이터를 읽기 및 쓰기 - 레코드란 데이터를 묶은 하나의 단위(사용자정의 데이터형) - 필드란 레코드내의 각 데이터형(몇 개의 바이트로 구성) • 사용자정의 데이터형 • 다른 데이터 형식들을 서로 그룹화하여 자신의 데이터 형식을 작성 • 레코드(Record), 또는 구조(Structure)라고 부름 [Private 또는 Public] Type 사용자정의 변수형 명 요소명1 As 데이터형 요소명2 As 데이터형 … 요소명n As 데이터형 End Type
Type userdata Name As String * 40 Address As String * 100 Email As String * 80 End Type 할당된 메모리 구조
사용자정의 변수(레코드형 변수) 선언 Type 문을 사용하여 사용자 정의형을 코딩하였다면 이를 사용하기 위해서 다음처럼 사용자정의 변수(레코드형 변수)로 선언해야 한다. Dim Email As userdata Userdata 레코드를 Email이라는 사용자 정의 변수로 선언한다. • 레코드의 특정 필드를 참조하려면 레코드의 이름과 필드이름을 연결하기 위해 마침표(.)를 사용한다. 예 Email.name = “Hong kil dong”
Open문 Open “파일명”For Random As [#]파일번호 Len = 레코드길이 - 레코드길이 생략 시 기본으로 128바이트가 된다. • Get #문 Get [ # ]파일번호, [ 레코드번호 ], 변수 Get #Fnum, 1, abc 지정한 파일번호의 첫번째 레코드를 읽어서 abc변수에 저장 • Put #문 Put [ # ]파일번호, [ 레코드번호 ], 변수 사용자정의 변수(레코드)에 있는 데이터를 Fnum 파일번호의 첫번째 레코드에 쓰기 Put #Fnum, 1, Email Put #Fnum, , Email Email 변수에 있는 데이터를 마지막으로 저장된 레코드 다음에 저장
3 랜덤파일1 만들기 • E-Mail 주소록을 만들어 이곳에 입력한 내용을 랜덤파일로 만들어 간단히 저장해 두는 프로그램 • E-Mail 주소록 창 디자인하기 • 레이블, 텍스트박스, 커멘드 컨트롤들을 각각 위와 같이 폼위에 배치한 후 이들 속성들을 다음과 같이 설정한다.
E-Mail 주소록 창 속성들 E-Mail 주소록 창 속성 계속
코드모듈의 (일반), (선언)에서 프로젝트(P) 모듈추가(M)을 클릭한 후 코딩한다. 첫째 모듈(Module1)
폼을 더블 클릭한 후 (일반), (선언) 클릭, 폼 안의 모든 프로시저에서 사용할 변수를 선언한다. Userdata 레코드를 Email이라는 사용자 정의변수로 선언한다. 폼안의 모든 프로시저에서 사용될 변수를 전역변수로 선언
앞에서 선언한 사용자정의형 변수에 데이터를 저장하기 위해서는 파일(c:\work\emailaddress)열기를 한다. • Emailaddress는 frmrandomfile 폼의 Form_Load( ) 프로시저에서 다음과 같이 코딩한다. Private Sub Form_Load( ) reclen = Len(email) fnum = FreeFile Open “c:\play\emailaddress” For Random As fnum Len = reclen currec =1 lasrec = FileLen(“c:\play\emailaddress”)/reclen If lasrec = 0 Then lasrec = 1 End If End Sub FreeFile( )함수로 파일번호를 찾아서 Fnum에 할당.② 레코드(Email) 한 개의 길이를 Len( )함수를 사용하여 계산한 후 Reclen에 할당.① C드라이브 내의 work 폴더에 emailaddress를 랜덤파일 쓰기로 열기한다. 만약, 파일이 없으면 새로 파일을 만든다.③ 현 레코드로 처음으로 돌린다.④ Filelen( )함수를 사용하여 파일의 마지막레코드 번호를 확인한 후 Lasrec에 할당.⑤ 만약, 파일이 새로 만들어지면 마지막 레코드를 1로 할당한다.⑥
파일로부터 읽어온 데이터를 화면에 나타내는 작업을 위한 코딩은 다음과 같이 한다. • 파일의 데이터를 화면에 나타내는 일은 반복적이고 자주 사용되는 부분이라 여기서는 서브프로시저로 만들어서 코딩한다. • 서브프로시저를 만들려면 도구(T) 프로시저 추가 (P)를 클릭한 후 프로시저 이름을 showcurrec라 설정한다. Public Sub showcurrec( ) Get #fnum, currec, email Txtname.Text = Trim(email.name) Txtadd.Text = Trim(email.address) Txtemail.Text = Trim(email.email) Lblreclist.Caption = “현재의 레코드번호는” + Str(lasrec) + “개의 레코 드중에서” + Str(currec) + “번째 레코드입니다.” End Sub 현재 레코드에 있는 데이터를 email에 읽기(파일읽기)① 레코드변수 email에 각 필드 데이터를 출력② 현재 레코드번호를 폼의 레이블에 출력③
4 버턴을 클릭하면 다음 레코드 데이터를 화면에 나타내도록 코딩 Private Sub Cmdnext_Click(Index As Integer) If currec = lasrec Then Beep MsgBox “파일의 끝입니다.”, vbExclamation Else savecurrec currec = currec + 1 showcurrec End If Txtname.SetFocus End Sub 현 레코드가 첫째이면 소리를 내고 메세지를 출력하고 그렇지 않으면 현 레코드를 저장하고 이전으로 레코드를 이동시킨 후 폼에 출력. 현재 레코드에서 하나 감소시키면 이전 레코드가 된다. 다음 텍스트 필드에 포커서를 만든다.
5 버턴을 클릭하면 이전의 레코드 데이터를 화면에 나타내도록 코딩 Private Sub Cmdprevious_Click(Index As Integer) If currec = 1 Then Beep MsgBox “파일의 시작입니다.”, vbExclamation Else savecurrec currec = currec - 1 showcurrec End If Txtname.SetFocus End Sub 현 레코드가 마지막이면 소리를 내고 메세지를 출력하고 그렇지 않으면 현 레코드를 저장하고 다음 레코드로 가서 폼에 출력. 현재 레코드에서 하나 증가시키면 다음 레코드가 된다. 다음 텍스트 필드에 포커서를 둔다. 6 현재의 레코드를 파일에 저장한 후 프로그램을 종료하도록 코딩 Private Sub Cmdexit_Click(Index As Integer) savecurrec Beep End End Sub
Email 주소록 실행 2-3. 랜덤파일2 만들기 어느 학교 학생들의 성적표를 Type 문을 사용하여 랜덤파일을 만들고 이를 관리할 수 있는 예제 프로그램을 작성
1 성적처리 프로그램 창디자인 하기 • 폼의 속성에서 (Name)을 Frmrandomfile1, Caption을 랜덤파일을 이용한 성적처리로 설정한다. • 메뉴를 만들기 위해서 도구(T) 메뉴편집기(M)을 클릭후 다음처럼 설정한다. 랜덤파일을 이용한 성적처리 프로그램 메뉴속성
2 프로젝트(P) 모듈(M)추가를 클릭후 사용자정의 형을 코딩한다. 구성된 기억 장소 • 폼을 더블 클릭, 프로시저명을 (일반), 이벤트명을 (선언)으로 바꾼 후 다음을 코딩한다. (성적 데이터를 저장) 3 학생수를 가리키는 변수 파일번호 • 프로시저명을 mnusave, 이벤트명을 Click으로 바꾼 후 다음을 코딩한다.
sung(3).Name = “임꺽정” sung(3).kor = “69” sung(3).eng = “90” sung(3).mat = “85” sung(3).lend = “vbCrLf sung(4).Name = “이몽룡” sung(4).kor = “97” sung(4).eng = “88” sung(4).mat = “91” sung(4).lend = “vbCrLf Open “c:\work\sungtable” For Random As #fnum Len = Len(sung(1)) For data =1 To 4 Put #fnum, data, sung(data) Next data Close #fnum End Sub Private Sub mnusave_Click( ) Dim sung(1 to 4) As Sungjuk Dim data As Integer fnum = FreeFile sung(1).Name = “홍길동” sung(1).kor = “87” sung(1).eng = “95” sung(1).mat = “92” sung(1).lend = “vbCrLf sung(2).Name = “변강쇠” sung(2).kor = “87” sung(2).eng = “90” sung(2).mat = “79” sung(2).lend = “vbCrLf
4 • 성적과 총점, 평균을 화면에 출력하여 보는 코딩을 한다. • 플렉스그리드(MsFlexGrid) 컨트롤을 사용하여 출력한다. • 프로젝트(P) 구성요소(O) MicroSoft FlexGrid Control 6.0을 클릭한다. MsFlexGrid 컨트롤 • 도구상자에서 플렉스그리드 컨트롤을 더블 클릭한 후 폼위에 배치한다. • 속성창에서 (이름)을 임의로 MSFG1로 설정하고 Row를 5, Cols를 6으로 설정한다. • 설정된 플렉스그리드 컨트롤을 사용자가 폼위에서 적절히 늘린다.
성적처리 결과를 플렉스그리드 컨트롤에 출력하기 위한 코딩 • 폼을 더블 클릭, 프로시저명 mnuopen, 이벤트명 Click 선택후 다음을 코딩 5 Private Sub mnuopen_Click( ) Dim sung(1 to 4) As Sungjuk Dim datakor As Integer Dim dataeng As Integer Dim datamat As Integer Dim tot As Integer Dim ave As Integer Dim strtot As Integer Dim strave As Integer fnum = FreeFile Open “c:\work\sungtable” For Random As #fnum Len = Len(sung(1)) For data = 1 To 4 Get #fnum, data, sung(data) datakor = Val(sung(data).kor) 저장된 성적데이터는 문자열이므로 계산을 위해서 Val( )함수를 사용하여 정수로 변환
dataeng = Val(sung(data).eng) datamat = Val(sung(data).mat) tot = datakor + dataeng + datamat ave = tot / 3 strtot = Str(tot) srtave = Str(ave) MSFG1.TextMatrix(data, 0) = sung(data).Name MSFG1.TextMatrix(data, 1) = sung(data).kor MSFG1.TextMatrix(data, 2) = sung(data).eng MSFG1.TextMatrix(data, 3) = sung(data).mat MSFG1.TextMatrix(data, 4) = strtot MSFG1.TextMatrix(data, 5) = strave Next data Close #fnum End Sub 계산된 총점과 평균값은 정수형이므로 출력을 위해서 Str( )함수를 사용하여 정수형의 값을 문자열로 변환 화면의 플렉스그리드 컨트롤(모눈)에 계산된 성적출력
플렉스그리드 컨트롤의 첫 줄(Row)에 성적처리표의 제목들을 삽입하기 위해서 프로시저명을 Form, 이벤트명을 Load로 바꾼 후 다음을 코딩한다. 6 Private Sub Form_Load( ) MSFG1.TextMatrix(data, 0) = “이 름” MSFG1.TextMatrix(data, 1) = “국 어” MSFG1.TextMatrix(data, 2) = “영 어” MSFG1.TextMatrix(data, 3) = “수 학” MSFG1.TextMatrix(data, 4) = “총 점” MSFG1.TextMatrix(data, 5) = “평균” End Sub 성적처리 결과