文件是指存放在外存储器 (如磁盘 )上的信息集合
使用文件可以将应用程序所处理的数据以文件的形式保
存起来
程序文件 和 数据文件
本章主要内容
文件基本操作
文件系统对象 (FSO)简介
第 8章 数据文件
8.1.1 数据文件的结构
数据文件由记录组成,记录由字段组成,字段由字符组成
8.1 数据文件概念
记录 1
数据文件
记录 2
…………
学号 姓名
951001 张三 …
学号 姓名
951002 李四 …
字段
(1)顺序文件,文件中的记录按顺序一个接一个地排列。
无法灵活地随意存取它。只适用于有规律的、不经常修改的
数据
(2)随机文件,随机文件的每一个记录都有固定的长度,
每一个记录都有记录号,这种文件的特点是允许用户存取文
件中任一个记录。可以同时进行读或写操作存入和读出速度
较快,数据容易更新
(3)二进制文件,可理解为长度为 1的特殊的随机文件
8.1.2 文件类型
(1) 打开 (或新建 )文件
(2) 进行读、写操作
系统设置文件指针,用来记住当前读写的位置
(3) 关闭文件
8.1.3 文件处理的一般步骤
1.打开文件 (Open)
Open 文件名 [For 模式 ][Access 存取类型 ][锁定 ] As [#]文件号 [Len=记录长度 ]
说明, (1)文件名 ;
(2) 模式 用于指定文件访问的方式,包括:
Append——从文件末尾添加 Binary——
Input——顺序输入 Output——
Random——随机存取方式
(3)文件号 (或称文件缓冲区 )
(4)存取类型,访问文件的类型,为 Read(只读 ),Write(只写 )、
Read Write(读写 )
(5)锁定,限制其他用户或其他进程对文件进行读写操作
Shared(共享 ),Lock Read(禁止读 ),Lock Write(禁止写 )、
Lock Read Write(禁止读写 )
(6)Len:用来指定每个记录的长度 (字节数 )
示例,Open "d:\cj1.dat" For Output As #1
8.1.4 文件的打开和关闭
2,关闭文件 (Close)
打开的文件使用完后必须关闭。
Close [#] 文件号 1 [,[#] 文件号 2 …] ]
示例:
Close #1
1,FreeFile
格式,FreeFile
功能:返回一个在程序中没有使用的文件号
示例,FileNo=FreeFile
Open "D:\MyFile.txt" For Output As FileNo
2,Seek语句和 Seek函数
Seek函数的格式,Seek(文件号 )
功能:返回文件指针的当前位置
对于随机文件,Seek函数返回指针当前所指的记录号。对于顺序文件,
Seek函数返回指针所在的当前字节位置 (从头算起的字节数 )
Seek语句的格式,Seek [#]文件号,位置
功能:将指定文件的文件指针设置在指定位置,以便进行下
一次读或写操作
对于随机文件,“位置”是一个记录号;对于顺序文件,“位置”表示字节
位置
8.1.5 相关的语句和函数
3,Eof函数
格式,Eof(文件号 )
功能:测试与文件号相关的文件是否已达到文件的结束
位置。如果是,函数值为真值,否则为假值。
使用 Eof是为了避免在文件结束处读取数据而发生错误
4,Lof
格式,Lof(文件名 )
功能:返回与文件号相关的文件的总字节数
5,Loc
格式,Loc(文件号 )
功能:返回与文件号相关的文件的当前读写位置
8.2.1 顺序文件的写入操作
以 Output或 Append方式打开文件,然后使用 Write#语句
或 Print#语句将数据写入文件中
1,Write
格式,Write #文件号 [,表达式表 ]
功能:将表达式的值写到与文件号相关的顺序文件中
每个 Write语句向顺序文件写入一个记录 (不定长 ),它会自
动地用逗号分开每个表达式的值。给字符串加上双引号
在最后一个字符写入后,插入一个回车换行符 (Chr(13) +
Chr(10))
示例,Write #1,"Good Afternoon",1998
8.2 顺序文件
把 1~ 50的 50个整数,以及这些数中能被 7整除的数分别
存入两个文件中,文件名为 num1和 num2,文件存放在 VB
缺省文件夹下
Private Sub Form_Load()
Open "num1.txt" For Output As #1
Open "num2.txt" For Output As #2
For i = 1 To 50
Write #1,i
If i Mod 7 = 0 Then Write #2,i
Next i
Close #1,#2
Unload Me
End Sub
说明,num1.txt文件中一共写入 50个记录,而 num2.txt文件只写入其
中能被 7整除的若干个记录
例 8.1 把 1~ 50各数及能被 7整除的数分别存入两个文件中
在例 8.1所生成的 num2.txt文件中,存放了若干个能被 7
整除的数,现要求再加入 51~ 200范围内能被 7整除的数
程序代码如下,
Private Sub Form_Load()
Open "num2.txt" For Append As #1
For i = 51 To 200
If i Mod 7 = 0 Then Write #1,i
Next i
Close #1
Unload Me
End Sub
例 8.2 在 num2.txt文件中加入 51~ 200范围内能
被 7整除的数
输入某小组 5名学生的成绩 (表 8.1),存放在“我的文
档” (C:\My Documents)文件夹下的新建顺序文件 Cj2.txt
设计步骤如下:
(1)创建应用程序的用户界面和设置对象属性
例 8.3 建立学生成绩顺序文件 Cj2.txt
(2) 设置事件过程
Form_Load():
Command1_Click(),接收录入信息,并以一个记录存入文件中
Command2_Click(),关闭文件和结束程序运行
Private Sub Form_Load()
Open,C:\my documents\Cj2.txt,For Output As #1
End Sub
Private Sub Command1_Click()
Dim num As String * 6,name As String * 8,score As Integer
num = Text1.Text
name = Text2.Text
score = Val(Text3.Text)
Write #1,num,name,score '存入记录
Text1.Text = "" '存完 1个记录后清空
Text2.Text = ""
Text3.Text = ""
Text1.SetFocus '设置焦点
End Sub
Private Sub Command2_Click()
Close #1
End
End Sub
程序运行完成后,用 Windows记事本来打开该顺序文件,
即可看到存入的文件内容
说明,在显示的文件内容中,字符串 (学号、姓名 )两边的引号
是系统自动加入的。字段之间通过逗号隔开
2,Print语句
格式,Print #文件号 [,表达式表 ]
作用与 Write一样。将一个或多个表达式的值写到
与文件号相关的顺序文件中。其输出数据格式与 Print
方法在窗体上输出格式相似。
示例:
Print #1,num,name,score ?对应按区格式
Print #1,num; name; score ?对应紧凑格式
先用 Input方式打开文件,然后采用 Input或 Line Input语
句从文件中读出数据。通常,Input用来读出 Write写入的记
录内容,而 Line Input用来读出 Print写入的记录内容
1,Input语句
一般格式,Input #文件号,变量名表
功能:从指定文件中读出一个记录。变量个数和类型应
该与要读取的记录所存储的数据一致。
打开文件时,文件指针指向文件中的第 1个记录,以后每
读取一个记录,指针就向前推进一次。如果要重新从文件的
开头读数据,则先关闭文件后打开
8.2.2 顺序文件的读出操作
程序代码如下:
Private Sub Form_Load()
Show
Open "data1.txt" For Output As #1
a = 123, b$ =,ABCD"
Write #1,a,b$ '存入
Close #1
Open "data1.txt" For Input As #1
Input #1,c,d$ '读出
Close #1
Print c,d$
End Sub
123 ABCD
例 8.4 一个存取数据的示例
已知文件,num2.txt”中存放一批能被 7整除的数 (见例 8.1
及例 8.2),现要求把这些数显示出来。每行显示 4个数。
Private Sub Form_Load()
Show
k = 0
Open "num2.txt" For Input As #1
Do While Not EOF(1) '文件未结束时,循环
Input #1,x
Print x,
k = k + 1
If k Mod 4 = 0 Then Print '每显示 4个数后换行
Loop
Close #1
End Sub
例 8.5 从文件, num2.txt”中读取数据
从文件 Cj2.txt(见例 8.3)中读出 5个学生的资料,显示在列
表框中,并求出平均分
(1) 创建应用程序的用户界面和设置对象属性
例 8.6 从文件 Cj2.txt中读出 5个学生的资料
(2)编写程序代码
功能要求,单击“查询”按钮时,则打开文件后读取文件
中所有记录内容,并显示在列表框 List1中,计算得到的平均
分显示在文本框 Text1中
Private Sub Command1_Click()
Dim n As String,m As String,s As Integer
Dim x As String,t As Integer
Open "C:\my documents\Cj2.txt" For Input As #1
t = 0
For i = 1 To 5
Input #1,n,m,s
x = n + Space(2) + m + Str(s)
List1.AddItem x, t = t + s
Next i
Close #1
Text1.Text = t / 5
End Sub
2,Line Input语句
格式,Line Input #文件号,字符型变量
功能:从打开的顺序文件中读出一个记录,即一行信息
例 8.7 Print语句和 Line Input语句配合使用的示例
Private Sub Form_Load()
Show
Open "mytxt.txt" For Output As #1
a = 123, b$ = "ABCD"
Print #1,a,b$ '写入第 1个记录
Print #1,a; b$ '写入第 2个记录
Close #1
Open "mytxt.txt" For Input As #1
Line Input #1,x$ '读出第 1个记录
Print x$
Line Input #1,x$ '读出第 2个记录
Print x$
Close #1
End Sub
3,Input
格式,Input(字符数,#文件号 )
示例,A$ =Input(20,#1)
顺序文件的缺点是不能快速地存取所需的数据,也不容
易进行数据的插入、删除和修改等工作,因此对于经常要修
改数据或取出文件中个别数据,均不适合使用,但对于数据
变化不大,每次使用时又需要从头往后顺序地进行读写,它
还是不失为一种好的文件结构
随机文件中每一个记录定长,并设置记录号,记录号从
1开始。
存取记录时,只要说明所需记录的编号,系统就以此算
出记录所在位置,然后加以写入或读出
8.3.1 初步认识
例 8.8 建立一个随机文件,文件中包含 10个记录,每个
记录由一个数 (1至 10)的平方、立方和开方根三个数值组成,
8.3 随机文件
(1) 通过 Type...End Type语句定义记录类型,
程序代码如下:
Private Type Numval
Squre As Integer
Cube As Long
Sqroot As Single
End Type
(2)利用某一过程 (本例采用事件过程 Form_Load)
来完成该随机文件的存取操作,程序代码如下:
Dim nv As numval '定义一个 numval类型的变量
nv
'写入记录程序段
Private Sub Form_Load()
Open "Data1.dat" For Random As #1 Len = Len(nv)
For i = 1 To 10
nv.squre = i * i
nv.cube = i * i * i
nv.sqroot = Sqr(i)
Put #1,i,nv
Next i
'读出记录程序段
Show
For i = 2 To 10 Step 4 '只读出 3个记录
Get #1,i,nv
Print "第 "; i; "号记录,",nv.squre,nv.cube,nv.sqroot
Next i
Close #1
End Sub
运行结果:
第 2号记录 4 8 1.414214
第 6号记录 36 216 2.44949
第 10号记录 100 1000 3.162278
进行随机文件存取操作,大致包括以下一些内容:
(1) 在打开文件进行随机访问之前,使用 Type…End Type 语
句定义一个 记录类型 (如 Numval),该类型包括多个数据项,并
与文件中记录应包括的域一致。
当通过 Dim定义一个变量 (如 nv)为一个记录类型 Numval时,
该变量也就包含该类型的多个数据项,以后可通过 nv.squre、
nv.cube,nv.sqroot进行引用
(2) 指定 Random类型打开文件,记录定长,打开文件后,就
可以存或取任一个记录
(3)分别通过 Get和 Put语句,并指定记录号进行读一个记录
或存一个记录
一定要建立好记录与记录号之间的关系
1,读语句
格式,Get #文件号[,记录号],变量
功能:从一个随机文件中读出指定记录到一个变量
2,
格式,Put #
默认情况下,记录号编号为上一次使用的记录号加 1
8.3.2 存取操作
建立一个有 5名职工工资信息的随机文件,其中包括职
工的职工号 (从 001开始 )、姓名及工资三种数据。采用职工号
(1) 在标准模块 Module1中用 Type语句定义一个
职工工资记录类型
Type Salary
Name As String*8 ?定长字符串类型
Salary As Long
End Type
不必把职工号作为记录的一个数据项存入文件
(2)利用事件过程 Form_Load来进行文件处理
例 8.9 建立职工工资随机文件
Private Sub Form_Load()
Dim sal As salary
Dim no As String * 3,recno As Integer
Open,Data2.dat" For Random As #1 Len = Len(sal)
For i = 1 To 5
s$ = "输入第 " + Str(i) + "个职工的 "
no = InputBox(s$ + "编号 ")
sal.name = InputBox(s$ + "姓名 ")
sal.salary = Val(InputBox(s$ + "工资 "))
recno = Val(no) '记录号
Put #1,recno,sal '存入记录
Next i
Close #1
End
End Sub
(1)创建应用程序的用户界面
(2)设置对象属性
例 8.10 对职工工资信息进行查询、增、改、除等操作
(3)编写程序代码
① 在标准模块 Module1中定义记录类型和建立一个通用过程
Type salary
name As String * 8
salary As Long
End Type
Public sal As salary,recno As Integer 'recno表示记录号
'检查编号的通用过程
Function Cheno(no As String) As Boolean
recno = Val(no)
If recno < 0 Or recno > 999 Then
MsgBox "输入的职工号超出范围 ",0,"检查编号 "
Cheno = True
Else
Cheno = False
End If
End Function
② 利用事件过程 Form_Load()来打开文件和显示第
一个记录
Private Sub Form_Load()
Open "Data1.dat" For Random As #1 Len = Len(sal)
Get #1,1,sal
Text1.Text = Format(1,"000")
Text2.Text = sal.name
Text3.Text = sal.salary
End Sub
③ 编写“查询”按钮的 Click事件过程
Private Sub Command1_Click()
If Cheno(Text1.Text) Then Exit Sub
If recno > LOF(1) / Len(sal) Then
MsgBox "无此记录 "
Exit Sub
End If
Get #1,recno,sal
Text2.Text = sal.name
Text3.Text = Str(sal.salary)
Text1.SetFocus '设置焦点
End Sub
④ 编写“增加”按钮的 Click事件过程
Private Sub Command2_Click()
If Cheno(Text1.Text) Then Exit Sub
sal.name = Text2.Text
sal.salary = Val(Text3.Text)
Put #1,recno,sal
Text1.SetFocus
End Sub
⑤ 编写“清除”按钮的 Click事件过程
Private Sub Command3_Click()
If Cheno(Text1.Text) Then Exit Sub
If recno > LOF(1) / Len(sal) Then
MsgBox "无此记录 "
Exit Sub
End If
sal.name = "" '记录内容清空
sal.salary = 0
Text2.Text = "" '文本框清空
Text3.Text = ""
Put #1,recno,sal
Text1.SetFocus
End Sub
⑥ 编写“关闭”按钮的 Click事件过程
Private Sub Command4_Click()
Close #1
Unload Me
End Sub
可以在应用程序中很方便地对文件和文件夹进行操作
(1)建立文件夹语句 (MrDir),MkDir [路径]文件夹名
示例,MkDir "D:\VB\Temp"
(2)改变当前文件夹语句 (ChDir),ChDir 路径
示例,ChDir "D:\VB\Dat"
(3)删除文件夹语句 (RmDir),RmDir [路径]文件夹名
示例,RmDir "D:\VB\Temp"
(4)删除文件语句 (Kill),Kill [路径]文件名
示例,Kill "D:\VB\datal.dat"
Kill "D:\VB\dat\*.*"
8.4 文件基本操作
(5)拷贝文件语句 (FileCopy):
FileCopy [路径 1] 源文件 [,[路径 2] 目标文件 ]
示例,FileCopy "C:\aaa.txt","D:\Temp\bbb.txt"
(6)文件的改名和移动:
Name 原名 As 新名
改名示例,Name "C:\aaa.txt" As "C:\ccc.txt"
移动示例,Name "C:\Aaa.txt" As "C:\Tmp\Aaa.txt"
在“我的文档” (C:\ My Documents)文件夹下创建一个
新文件夹,mydir”,然后复制文件,C:\ My Documents\
cj2.txt”到新文件夹下,复制生成的文件名称由用户指定
Private Sub Form_Load()
Show
Print "正在进行文件操作 "
MkDir "c:\my documents\mydir"
fname = InputBox("请输入新文件名 ","更改文件名 ")
fname = "c:\my documents\mydir\" + fname + ".txt"
FileCopy "c:\my documents\cj2.txt",fname
Print "已完成要求的操作 "
End Sub
例 8.11 文件操作示例
(7)调用应用程序
格式,Shell(命令字符串 [,窗口类型 ])
功能:调用指定应用程序
示例:
x = Shell("C:\Windows\Explorer.exe",1)
执行,C:\Windows” 文件夹下的应用程序 Explorer.exe,并
显示该程序窗口
FSO (File System Object,文件系统对象方法 )
FSO采用面向对象的编程方法,提供了一整套对文件系
统进行管理和操作的属性、方法和事件 。可以实现文件夹的
创建、更名、移动和删除等操作,能够检测文件夹是否存在,
可以创建文本文件,还可以获得驱动器、文件夹及文件的许
多信息
但不支持二进制文件和随机文件的创建和操作
将逐渐淘汰传统的文件访问机制 (即用 Open等 I/O语句及
函数来实现对文件进行操作 )
8.5 文件系统对象 (FSO)