出】按钮,然后打开D盘的Score.TXT文件,如图8-9所示。可以看出,Print语句仍然按标准格式(用逗号分隔时)与紧凑格式(用分号分隔时)输出,并且在数值前除了保留一个符号位外,还保留了一个空格。而Write语句则在各数据项之间插入了逗号,并且给字符串加了双引号。

图8-9 Print与Write输出格式对比
另外,如果将上面的Open "D:\Score.TXT" For Output As FileNum语句中的Output改成Append,则可实现向Score.TXT文件中追加学生成绩的功能。
实例8.3 读出D盘Score.TXT中的成绩
仍然设计一个如图8-7所示的窗体,然后在其代码窗口中输入如下代码:
Option Explicit
Private FileNum As Integer
Private num As String, Course1 As Integer, Course2 As Integer, Course3 As Integer, Course4 As Integer, HintStr As String
Private Sub Form_Load()
Me.Caption = "读出保存在Score.TXT中的学生成绩"
Label1.Caption = "显示学期成绩:"
Label2.Caption = "学号:"
Label3.Caption = "邓小平理论"
Label4.Caption = "中国革命史"
Label5.Caption = "数据结构":Label6.Caption = "软件工程"
Text1.Text = Space(0):Text2.Text = Space(0):Text3.Text = Space(0)
Text4.Text = Space(0):Text5.Text = Space(0)
Command1.Caption = "用Input读出":Command2.Caption = "用Line Input读出"
Command3.Caption = "退出"
FileNum = FreeFile()
Open "D:\Score.TXT" For Input As FileNum '以只读方式打开
End Sub
Private Sub Command1_Click()
Input #FileNum, num, Course1, Course2, Course3, Course4, HintStr
Text1.Text = num:Text2.Text = Str(Course1):Text3.Text = Str(Course2)
Text4.Text = Str(Course3):Text5.Text = Str(Course4)
If EOF(FileNum) Then
Command1.Enabled = False:Command2.Enabled = False:Command3.SetFocus
End If
End Sub
Private Sub Command2_Click()
Line Input #FileNum, num
Me.Caption = num
If EOF(FileNum) Then
Command1.Enabled = False:Command2.Enabled = False:Command3.SetFocus
End If
End Sub
Private Sub Command3_Click()
Unload Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
Close FileNum
End Sub
运行这个窗体,先按【用Line Input读出】按钮,Line Input语句读出了第一行数据,通过窗体的标题栏可以看到这组数据;再按一次该按钮,第二行数据也显示在了标题栏上,这时就可以按【用Input读出】按钮了,第三位同学的数据出现在文本框中。可以看出,Input与Line Input语句读数据的方式是有区别的。
有些同学运行此窗体时,首先按下的是【用Input读出】按钮,结果弹出了一个出错对话框,为什么会出现这种情况呢?这主要是因为前两行是用Print语句写入的,而如果要想用Input语句正确读出数据,要求必须是用Write写入的。这就是出错的原因所在!
所谓随机文件,是指随机存取的文件,即可以在文件的任意位置写入数据或读出数据,而不必从文件头开始。
随机文件由固定长度的记录组成,一条记录包含一个或多个字段。随机文件中每个记录都有一个记录号,每个记录的末尾不加记录结束标志。在读写数据时,只要给出记录号,就可以直接对该记录进行读写。
随机文件一律以二进制形式存储在外部介质上。对同一个随机文件,同时既可以读,又可以写,这比顺序文件方便。
打开文件的格式:
Open 文件名 [for Random] As [#]文件号 Len=记录长度
说明:
若省略for Random,则默认为Random类型。
记录长度是一条记录所占的字节数,可以用Len函数获得。
随机文件的关闭与顺序文件相同。
1.写数据语句
格式:
Put #文件号,[记录号],变量
说明:
省略记录号时,数据将输出到文件指针当前所指的记录处,否则,输出到由记录号指定的记录处。Put语句的输出变量只能有一个。
2.读数据语句
格式:
Get #文件号,[记录号],变量
说明:
省略记录号时,数据将从文件指针当前所指的记录处读出记录,否则,读出记录号指定的记录。在Put语句中只能写一个输入变量名。
二进制文件是字节的集合,对二进制文件的处理,可以以字节为单位对数据进行读写。
事实上,二进制文件并不是一种文件类型,它只是对文件的一种处理方式。可以将二进制文件看作记录长度为1的随机文件。可见,两种文件可以用相同的方式进行处理。例如,读写随机文件的Put、Get语句也可以用于读写二进制文件。
打开文件的格式:
Open 文件名 for Binary As [#]文件号
二进制文件的关闭与随机文件相同。
1.写数据语句
格式:
Put #文件号,[位置],变量
2.读数据语句
格式:
Get #文件号,[位置],变量
实例8.4 一个简单的加解密程序
新建一个窗体,在上面画两个标签,一个文本框,三个命令按钮,一个图像控件,设置图像控件的Stretch属性为True,给图像控件设置一张图片。其界面如图8-10所示。

图8-10 加解密窗体的设计界面
在其代码窗口中输入如下代码:
Option Explicit
Dim CurrentByte As Integer
Dim FileName As String
Dim CurrentPosition As Long
Dim TotalByteNum As Long
Private Sub FileNameAndLength() '自定义过程,取出文件名,求文件的大小
If InStrRev(Text1.Text, "\") Then '如果文件名包含路径
FileName = Mid(Text1.Text, InStrRev(Text1.Text, "\") + 1)
Else
FileName = Text1.Text
End If
'FileLen(文件名)函数返回一个未打开文件的大小,单位是字节
TotalByteNum = FileLen(Text1.Text)
End Sub
Private Sub Form_Load()
Me.Caption = "一个简单的加解密程序。注意:输入文件名时要包含路径"
Label1.Caption = "请输入要加|解密的文件名:":Label2.Visible = False
Command1.Caption = "加密"
Command2.Caption = "解密"
Command3.Caption = "退出"
Text1.Text = "C:\WINDOWS\PBRUSH.EXE"
End Sub
Private Sub Command1_Click()
Label2.Visible = True:Label2.Caption = "正在加密,请稍候..."
Call FileNameAndLength
FileName = "D:\" + FileName
Open Text1.Text For Binary As #1 '源文件
Open FileName For Binary As #2 '加密后的文件
CurrentPosition = 0
Do While CurrentPosition < TotalByteNum
CurrentPosition = CurrentPosition + 1
Get #1, CurrentPosition, CurrentByte
Put #2, CurrentPosition, CurrentByte + 1 '加密算法为:当前字节值加1
Loop
Close #1:Close #2
Label2.Caption = "加密完毕,加密后的文件保存在" + FileName
Command1.Enabled = False
Command2.Enabled = True
End Sub
Private Sub Command2_Click()
Label2.Caption = "正在解密,请稍候..."
Label2.Visible = True
Call FileNameAndLength
FileName = "E:\" + FileName
Open Text1.Text For Binary As #1 '源文件
Open FileName For Binary As #2 '解密后的文件
CurrentPosition = 0
Do While CurrentPosition < TotalByteNum
CurrentPosition = CurrentPosition + 1
Get #1, CurrentPosition, CurrentByte
Put #2, CurrentPosition, CurrentByte - 1 '解密算法为:当前字节值减1
Loop
Close #1
Close #2
Label2.Caption = "解密完毕,解密后的文件保存在" + FileName
Command1.Enabled = True:Command2.Enabled = False
End Sub