Reading and Writing Files in Visual Basic
By Herbert J. Bernstein
© Copyright 1999 Herbert J. Bernstein
Computers store information in many ways. The registers within processors and random access memory (RAM) are the most immediately accessible storage. Any portion of that memory may be read or written on time scales commensurate the the rate of instruction execution. However, the information stored there may be lost when a computer is turned off. Disks and tapes are used for secondary storage. In general, it takes longer to access each portion of memory from a disk or tape than from RAM, but there is room for more information and the information can be preserved long term.
Modern computer operating system organize the information on secondary storage devices into "Files". If the file is organized so that it must be read or written in sequence, i.e. from beginning to end, the file is called a sequential file. If the file is organized so that we may go directly to any selected portion of the file, it is called a direct access file or a random access file. Depending on the particular operating system, subtle distinctions may be made among types of files. For example, some files may be organized to handle lines of text, while others may be organized to handle streams of binary data.
The statements to provide access to files in Visual Basic are of the form:
Close #num
Open filename$ For mode As #num
Open filename$ For mode As #num Len = reclen
Get #num, record_num, record_var
Input #num, variable_list
Line Input #num, line_string$
Print #num, expression_list
Put #num, record_num, record_var
Write #num, expression_list
The Open and Close statements are used to start and end the association between a file on disk and a special file number identifier #num, which is used internally within the program. The valid modes are Output, Input, Append, Binary and Random. A file opened for Output is written from the beginning. A file opened for Input is read from the beginning. A file opened for Append is written from the end of the data previously written. A file opened for Binary may be written or read without any formatting. A file opened for Random permits the use of Put and Get for random access to records in arbitrary order. For both Binary and Random the Len field should be used to specify the length of each record in characters.
The modifier Lock may be added to a mode to provide an interlock on access by multiple processes. The mode Shared is used to allow shared access.
The function EOF with an argument equal to a file number (without the "#") returns true when a sequential file reachs end of file.
Let us look at a shell sort done to from one file to another.
Rem Sample of a File-based Shell Sort
Rem H. J. Bernstein, 17 November 1999
Rem Requires a Form with an output file name text box Text1
Rem an input file name text box Text2
Rem a scratch file text box Text3
Rem a sort button SortButton
Private Sub SortButton_Click()
REM Set up error handling if file does not exist
On Error GoTo ErrorHandler
Dim FileName As String
Dim MyString As String
Dim String1 As String
Dim String2 As String
Dim RecNum As Integer
Dim Range As Integer
Dim Done As Integer
Dim NameCount As Integer
Dim Icount As Integer
REM Open files
FileName$ = Text1.Text
Open (FileName$) For Input As #1
FileName$ = Text2.Text
Open (FileName$) For Output As #2
FileName$ = Text3.Text
RecNum = 0
Open (FileName$) For Random As #3 Len = 255
REM Copy each line of the input file to the temporary random file
While Not EOF(1)
Line Input #1, MyString
RecNum = RecNum + 1
Put #3, RecNum, MyString
Wend
REM Sort the Random file with a Shell sort
NameCount = RecNum
Range = Int(NameCount / 2)
Do While (Range > 0)
Do
Done = 1
For Icount = 1 + Range To NameCount Step Range
Get #3, Icount - Range, String1
Get #3, Icount, String2
If (UCase(String1) > UCase(String2)) Then
Put #3, Icount - Range, String2
Put #3, Icount, String1
Done = 0
End If
Next Icount
Loop Until (Done = 1)
Range = Int(Range / 2)
Loop
REM Copy the sorted file to the output file
For Icount = 1 To NameCount
Get #3, Icount, MyString
Print #2, MyString
Next Icount
REM Close all files
Close #1
Close #2
Close #3
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 53
MsgBox ("Unable to open " & FileName$)
End Select
Resume
End Sub
Private Sub Form_Load()
Text1.Text = ""
Text2.Text = ""
Text3.Text = "C:\tmp\Sort.tmp"
End Sub