Visual Basic 随机文件
随机文件是以随机方式存取的文件,由一组长度相等的记录组成。它有如下特点:
- 随机文件的记录长度为固定长度。使用前每个字段所占字节必须事先定好。
- 记录包含有一个或多个字段,记录必须是用户自定义类型。
- 每个记录都有一个记录号,随机文件打开后,既可读又可写,可以根据记录号访问文件中的任何一个记录,不需要像顺序文件一样按顺序进行。
1. 打开文件
随机文件的打开仍用Open语句,格式为:
Open <文件名> [For Random] As <文件号> [Len=<记录长度>]
其中,Random是缺省的访问类型,可以省略。记录长度默认为128个字节,每个记录的长度是将各字段所占的字节数相加。如果记录长度比文件记录的实际长度短,则产生一个错误;如果比记录的实际长度长,则会浪费磁盘空间。可以用Len( )函数返回记录的长度。
随机文件与顺序文件一样,使用Close语句关闭打开的文件。
2. 读操作
要对打开的随机文件中记录进行编辑,应先把记录从文件读到内存变量。把记录读入变量,使用Get#语句:
Get #<文件号>,[记录号],<变量名>
其中,记录号是要读记录的编号,记录号可以是整型、变体或长整型,如果省略记录号,则为最近执行Get或Put语句的下一个记录,或由Seek函数指定的记录。变量名是接收记录内容的记录型变量名,一般声明为用户定义类型。
3. 写操作
Put#语句用于将变量中的内容写入磁盘文件中,进行记录的添加或替换。其格式为:
Put #<文件号>,[记录号],<变量名>
其中,记录号是要写入或替换的记录位置,变量名是要写入磁盘的数据的变量名,其数据类型应与记录类型一致。
在随机文件中添加记录,事先找出文件的最后一个记录的记录号,然后将新的记录写在它的后面,使用Put#语句向随机文件的末尾添加新记录。
4. 删除记录
通过清除其字段可以删除一个记录,但是该记录仍在文件中存在。通常文件中不能有空记录,最好把余下的记录拷贝到一个新文件,然后删除老文件。要清除随机文件中删除的记录,可按下面几步执行:
(1) 创建一个新文件。
(2) 把有用的所有记录从原文件复制到新文件。
(3) 关闭原文件并用Kill语句删除。
(4) 使用Name语句把新文件重新命名为原文件名。
【例6.3】 将某班学生考试成绩输入到“考试成绩”随机文件中。每个学生的记录包含学号、姓名、数学成绩、语文成绩和外语成绩五个字段,如表6.4所示。
表6.4 学生成绩单
学号 | 姓名 | 数学成绩 | 语文成绩 | 外语成绩 |
0046 | 王晓明 | 85 | 78 | 65 |
0047 | 李 宁 | 75 | 80 | 78 |
0048 | 唐福强 | 67 | 76 | 94 |
…… | …… | …… | …… | …… |
0090 | 张大力 | 82 | 86 | 83 |
创建用户界面。在窗体中先添加两个框架Frame1和Frame2。在Frame1中添加一个文本框数组Text1(0)~Text1(4)和5个标签,在Frame2中添加一个列表框List1,在两个框架之间添加4个命令按钮Command1~Command4,如图6.10所示。

图6.10 随机文件的操作
首先在窗体的通用过程段创建用户定义类型变量:
Private Type cj
xh As String * 6
xm As String * 6
sx As Integer
yw As Integer
wy As Integer
End Type
Private cjd As cj
编写显示、输入、添加、删除及列表框的Click事件代码:
Private Sub Command1_Click() '显示数据
Dim lastrec As Integer
Dim sx As Single, yw As Single, wy As Single
Open "考试成绩" For Random As #1 Len = Len(cjd)
lastrec = LOF(1) / Len(cjd)
List1.Clear
For n = 1 To lastrec
Get #1, n, cjd
With cjd
xh = Format(.xh, "@@@@@@")
xm = Format(RTrim(.xm), "@@@@@@")
sx = Format(.sx, "####")
yw = Format(.yw, "####")
wy = Format(.wy, "####")
msg = xh & xm & " " & sx & " " & yw & " " & wy
End With
List1.AddItem msg
Next
Close #1
End Sub
Private Sub Command2_Click() '输入数据
For i = 0 To 4
Text1(i).Text = ""
Next
Text1(0).SetFocus
Command3.Enabled = True
End Sub
Private Sub Command3_Click() '添加记录
Dim lastrec As Integer
For i = 0 To 4
If Text1(i).Text = "" Then
MsgBox "数据不全,输入完整后再添加", , "添加记录"
Exit Sub
End If
Next
With cjd
.xh = Text1(0).Text
.xm = Text1(1).Text
.sx = Val(Text1(2).Text)
.yw = Val(Text1(3).Text)
.wy = Val(Text1(4).Text)
End With
Open "考试成绩" For Random As #1 Len = Len(cjd)
lastrec = LOF(1) / Len(cjd)
Put #1, lastrec + 1, cjd
Close #1
Call Command1_Click
Command3.Enabled = False
End Sub
Private Sub Command4_Click() '删除记录
Dim lastrec As Integer
recnum = List1.ListIndex + 1
Open "临时数据" For Random As #1 Len = Len(cjd)
Open "考试成绩" For Random As #2 Len = Len(cjd)
lastrec = LOF(2) / Len(cjd)
For n = 1 To lastrec
If n <> recnum Then
Get #2, n, cjd
Put #1, , cjd
Else
Get #2, n, cjd
With cjd
Text1(0).Text = .xh
Text1(1).Text = .xm
Text1(2).Text = .sx
Text1(3).Text = .yw
Text1(4).Text = .wy
End With
End If
Next
Close #1
Close #2
Kill "考试成绩"
Name "临时数据" As "考试成绩"
Call Command1_Click
End Sub
Private Sub List1_Click()
If List1.ListIndex > -1 Then
Command4.Enabled = True
Else
Command4.Enabled = False
End If
End Sub
