Programming/Visual Basic

[비베] 파일입출력

bcheul 2007. 5. 16. 10:30


소스에요~



'#### 파일입출력 기본기 -_-ㆀ#####################-시작-########
'파일 내용을 텍스트 그대로 읽을 수 있는 두가지 구문만 제시합니다.
'읽기 : Line Input
'쓰기 : Print

Sub 파일읽기_1_LineInput_한번()

Dim LineBuffer As String '한줄을 읽어온 것이 들어갈 임시저장소입니다.

Open "C:\test1.txt" For Input As #1 '#1(1번) 핸들을 통해 "C:\test1.txt"로 접근합니다.
     Line Input #1, LineBuffer '#1 핸들에서 한줄을 읽어서 LineBuffer에 넣습니다
Close #1 '1번핸들을 닫습니다. (마무리^^)

MsgBox LineBuffer
End Sub


Sub 파일읽기_1_LineInput_전체()

Dim LineBuffer As String '한줄을 읽어온 것이 들어갈 임시저장소입니다.
Dim WholeText As String '전체 텍스트입니다. 적은 용량 전용이죠.

Open "C:\test1.txt" For Input As #1

     Do Until EOF(1) 'EOF(X)는 X핸들이 파일의 끝에 다다른 것인지

                                  '아닌지를 반환합니다. End Of File의 약자이죠.
                                  '"파일 끝에 도착할때까지 읽어대쇼" 란 뜻입니다.
         Line Input #1, LineBuffer
          WholeText = WholeText & LineBuffer & vbCrLf

                                   'WholeText 뒤에 LineBuffer의 내용과 줄바꿈을 합니다.
                                   'VbCrlf는 엔터키라고 할 수 있죠.. 줄바꿈은 포함되지 않거든요^^
    Loop
Close #1 '마무리.. (이제 중복은 안씁니다..)

MsgBox WholeText
End Sub


Sub 파일쓰기_1_Print()


Dim Contents As String
Contents = InputBox("아무거나 입력해보세요") '아무 내용이나 받아서 일단 넣습니다..

Open "C:\test1.txt" For Output As #1 'Output모드로 연 후에
     Print #1, Contents '#1에 Contents를 넣습니다.
Close #1 '끝

Dim MsgBoxRes As Integer
MsgBoxRes = MsgBox("확인해보실래요?", vbYesNo + vbQuestion)
If MsgBoxRes = vbYes Then Shell "notepad c:\test1.txt", vbNormalFocus

End Sub
'정리 : Line Input - Print
'#### 파일입출력 기본기 -_-ㆀ#########################-끝-#########


'#### 파일입출력 이외것들 -_-ㆀ#######################-끝까지-#######

Sub 파일읽기_2_Input_한번()
'Input문은 쉼표, 줄바꿈 단위로 읽혀지며 쌍따옴표로 묶인 단위로 읽히기도 합니다.
Dim Buffer As String

Open "C:\test2.txt" For Input As #1
     Input #1, Buffer '1번파일에서 단위에 맞게 한번 읽어다가 Buffer에 넣습니다.
Close #1

MsgBox Buffer
End Sub



Sub 파일읽기_2_Input_전체()
'Input으로 읽은 내용은 리스트와 비슷하기 때문에 리스트 구조를 따르겠습니다.
Dim List() As String
Dim Listcount As Integer
Dim Buffer As String

Open "C:\test2.txt" For Input As #1
   
     Do Until EOF(1) '파일 끝까지 행합니다.
          ReDim Preserve List(Listcount) 'List 공간을 하나 늘립니다.
          Input #1, Buffer '첫 단위를 읽고,
          List(Listcount) = Buffer 'Listcount가 가리키는 List공간에

                                                     '버퍼에 있는 내용을 넣습니다.
          Listcount = Listcount + 1 '리스트 카운터를 하나 증가시켜 놓습니다.
     Loop

Close #1

Dim PrintingText As String '아래는 출력용입니다. ---------------------------------
Dim I As Integer
For I = 0 To UBound(List) 'UBound는 배열의 끝수를 가리킵니다.
     Dim Tmp As Integer '비베가 왈왈거려서 잠깐.. -_-;;
     Tmp = UBound(List)
     PrintingText = PrintingText & Format(I, String(Len(Tmp), "0")) & " - " & List(I) & vbCrLf

                        'String(A,B)는 A만큼의 수만큼 B에 해당하는 문자를 반복하란 함수입니다.
Next I
MsgBox PrintingText
End Sub



Sub 파일쓰기_2_Write()
'Write는 행 단위로 쓰이기 때문에 변수에 들어있는 줄바꿈 같은건 무시됩니다.
'입력과 동시에 쓰도록 하겠습니다.

Dim Item As String
Open "C:\test2.txt" For Output As #1
     Item = InputBox("문자열을 입력하세요. 취소를 누르시거나 빈 문자열을 입력하시면 입력이 종료됩니다.")
     Do Until Item = ""
          Write #1, Item '핵심구문 -_-;;;; 잡다한게 너무 많죠?;;
          Item = InputBox("문자열을 입력하세요. 취소를 누르시거나 빈 문자열을 입력하시면 입력이 종료됩니다.")
     Loop
Close #1

End Sub
'정리 : Input - Write


Sub 파일읽기_3_Get_RandomMode(Optional ParamRecordLen As Integer)

                                                    '옵셔널을 처음 보셨다면.. 선택적 인수는 들어보셨는가요?

'Put, Get문은 레코드 형식을 따릅니다.

'DB형식을 따르는 것이 당연하겟지만 만들기 영 귀찮아스리-_-;;
'리스트 구현해서 하겠습니다 ㅋㅋ / Random과 Binary형식밖에 없는듯.. -_-;;
Dim List() As String
Dim Listcount As Integer
Dim Buffer As String
Dim RecordLen As Integer
RecordLen = 1 '기본값은 1입니다.
If ParamRecordLen > 0 Then RecordLen = ParamRecordLen

                                                      '만약 인수로 들어온 레코드길이값이 있다면 교체해줍니다.

Open "C:\test3.txt" For Random As #1 Len = RecordLen

                                                      '길이를 설정해주고 Random모드로 읽습니다.

     Do Until EOF(1)
          ReDim Preserve List(Listcount)
          On Error Goto Inc_RecordLen

                                            '레코드 길이가 맞지 않아서 열리지 않을때...

                                            '1을 늘려서 다시하도록 합니다. 저 절취선 아래로..
          Get #1, , Buffer
          List(Listcount) = Buffer
          Listcount = Listcount + 1
     Loop
Close #1

Dim PrintingText As String '아래는 출력용입니다. ---------------------------------
Dim I As Integer
For I = 0 To UBound(List) 'UBound는 배열의 끝수를 가리킵니다.
     PrintingText = PrintingText & Format(I, String(UBound(List), "0")) & " - " & List(I) & vbCrLf

Next I
MsgBox PrintingText


Exit Sub '에러 핸들 앞에서는 서브가 끝나야 합니다.

               '아니면 에러핸들까지 실행해 버리거든요^^
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 절취선 -_-ㅋㅋ
Inc_RecordLen:
Close #1
RecordLen = RecordLen + 1 '레코드길이를 하나 늘리고
파일읽기_3_Get_RandomMode (RecordLen) '재호출합니다.
End Sub



Sub 파일쓰기_3_Put_RandomMode()
'얘는 입력먼저 나중에 쓰기로 하겠습니다.
Dim List() As String
Dim Listcount As Integer
Dim Item As String
Dim RecordLen As Integer '레코드길이란 개념이 -_-;;; 문자열에선 좀 귀찮죠..

Item = InputBox("문자열을 입력하세요. 취소를 누르시거나 빈 문자열을 입력하시면 입력이 종료됩니다.")
Do Until Item = ""
     ReDim Preserve List(Listcount)
     List(Listcount) = Item
     Listcount = Listcount + 1
     If RecordLen < LenB(Item) Then RecordLen = LenB(Item)

                                                      '가장 긴 문자열의 길이를 구합니다.(바이트단위)
     Item = InputBox("문자열을 입력하세요. 취소를 누르시거나 빈 문자열을 입력하시면 입력이 종료됩니다.")
Loop

Dim I As Integer
Open "C:\test3.txt" For Random As #1 Len = RecordLen + 2

                                                      '2바이트의 설명자가 추가되기 때문에.. 늘려줘야됩니다..
     For I = 0 To UBound(List)
          Put #1, I + 1, List(I)
     Next I
Close #1

End Sub



Sub 파일읽기_3_Get_BinaryMode()
Dim Buffer(511) As Byte '바이트를 사용합니다. 한번에 512 바이트를 읽게되겠지요..
Dim WholeText As String
Dim I As Integer

Open "C:\test4.txt" For Binary As #1
     Do Until EOF(1)
          Get #1, , Buffer
          For I = 0 To 511
               WholeText = WholeText & Chr(Buffer(I))
          Next I
     Loop
Close #1

MsgBox WholeText
End Sub



Sub 파일쓰기_3_Put_BinaryMode()
Dim Buffer(2047) As Byte

'입력을 받겠습니다.
'입력예제:

((입력예제 생략))

Dim I, J As Integer 'I는 한번 입력시의 루프카운터 역할을,

                                 ' J는 Buffer에 입력된 끝값의 길이를 나타내는 역할을 하게됩니다.
Dim Item As String
Dim ByteTable() As String
Item = InputBox("쉼표로 구분지어서 범위에 맞는(0~255) 숫자를 입력해 주세요. 취소를 누르시거나 빈 문자열을 입력하시면 입력이 종료됩니다. 남은 바이트수 : " & 2047 - J)
Do Until Item = ""
     ByteTable = Split(Item, ",") '쉼표단위로 잘라서 ByteTable에 넣습니다.
     For I = 0 To UBound(ByteTable)
          If Val(ByteTable(I)) > 255 Then ByteTable(I) = 255

                                                       '255를 넘어갈때 강제로 255로 바꾸고
          If IsNumeric(ByteTable(I)) = False Then ByteTable(I) = 0

                                                      '숫자가 아닐때 0으로 만들어 버립니다.
          If J + I > 2047 Then '입력점이 넘어간다면,
               MsgBox "버퍼한도를 넘어갔으므로 이후값은 무시하고 진행합니다."
               Exit Do
          End If
          Buffer(J + I) = CByte(ByteTable(I))

                                                      '바이트 형식으로 바꿔서 Buffer에 차례대로 넣습니다.
     Next I
     J = J + I '다음번 입력시에 Buffer에 입력될 시작점을

                   '이번에 입력한 만큼 뒤로 미룹니다. For에서 I는 1이 증가된상태로 내려옵니다.
     Item = InputBox("쉼표로 구분지어서 범위에 맞는(0~255) 숫자를 입력해 주세요. 취소를 누르시거나 빈 문자열을 입력하시면 입력이 종료됩니다. 남은 바이트수 : " & 2047 - J)
Loop
'입력 종료 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

'두가지방법을 선택하도록 하겠습니다.
'1번방법 : 바이트 하나하나
'2번방법 : 문자열로 옮겨서

Dim MsgBoxRes
MsgBoxRes = MsgBox("1번방법(바이트 하나하나)으로 하시겠습니까? (No=2번방법(문자열로 옮겨서))", vbYesNo + vbQuestion)
If MsgBoxRes = vbYes Then
     Open "C:\test4.txt" For Binary As #1
          For I = 0 To 2047
               Put #1, , Buffer(I)
          Next I
     Close #1
ElseIf MsgBoxRes = vbNo Then
     Dim WholeText As String
     For I = 0 To 2047
          WholeText = WholeText & Chr(Buffer(I))
     Next I
     Open "C:\test4.txt" For Binary As #1
     Put #1, , WholeText
     Close #1
Else
     MsgBox "?????"
End If

End Sub