文件是指存放在外部介质上的以文件名标识的数据集合。按文件存储的内容可将文件分为程序文件和数据文件。程序文件是指令的有序集合。数据文件是专门存放程序中所使用的数据的文件,如学生成绩,图书资料等。这些数据可以是程序运行调用的原始数据,也可以是程序运行后的处理结果。本章将主要讨论数据文件的操作。
划分依据不同,文件的分类方式也不相同。根据数据存取方式和文件结构,文件可分为顺序文件和随机文件。
⑴ 顺序文件
顺序文件就是普通的文本文件,可以用记事本等文字编辑软件查看。顺序文件中记录一个接一个地顺序存放,读取顺序与存储顺序一致。也就是说,对顺序文件的读取和写入都只能按顺序从头到尾依次进行,不能直接定位于所要处理的记录。
⑵随机文件
随机文件又称为直接存取文件,它的每个记录的长度是固定的,而且都有一个记录号,对文件中记录的读取和写入可根据记录号直接进行,因此它读取速度比顺序文件快得多。随机文件只能通过程序访问,不能通过文字编辑软件打开查看。
顺序文件的打开与关闭
无论是哪种类型的文件,基本操作都分为三个步骤:①打开文件,②读取文件内容或者向文件写入内容,③关闭文件。
1. 顺序文件的打开
顺序文件的打开要使用Open语句。
格式:
Open <文件名> For打开方式 As [#]文件号
说明:
⑴文件名:表示要打开的文件名称,包含所在路径。
⑵打开方式:指打开文件的输入、输出方式,对于顺序文件有如下形式:
Output:向文件中写入数据。若指定的文件不存在,则创建新文件。
Input:读取文件中的数据内容。要求文件必须已经存在。
Append:向文件中写入数据。若指定的文件不存在,将自动建立一个新文件。它与Output的区别为:Output 方式的写,是将文件原有内容清除,从头再写。Append 方式的写,是保留文件原有内容,从文件尾接着写。
⑶文件号:一个整型表达式,其值在1~511,在操作文件时以该数字代替文件名。
Open语句用法示例。
①打开C盘VB文件夹下的顺序文件A.dat,并准备将数据写入文件,指定文件号为1。文件打开语句为:
Open
"C:\VB\A.DAT" For Output As #1
②将①中的顺序文件打开,并进行写操作,但保留原记录。
Open
"C:\VB\A.DAT" For Append As #1
③将②中的顺序文件打开,指定文件号为2,并准备读取文件中的数据。
Ch$="C:\VB\A.DAT" '此例将文件名赋值给字符串变量Ch。
Open
Ch For Input As #2
2.文件的关闭
顺序文件的关闭都要使用Close语句。
格式:Close [文件号列表]
例如:
Close
#1 关闭1号文件
Close
2,3 关闭2号和3号文件,可以省略#
Close 关闭所有已经打开的文件
12.1.3 ?xml:namespace>顺序文件的读写操作
向顺序文件中写数据的语句有Print语句和Write语句。从顺序文件读数据的语句有:Input语句、Line Input语句和Input$函数。
1.Print语句
格式:Print #文件号,[表达式列表]
功能:将数据写入顺序文件中。
说明:Print语句的使用方法与Print方法一样。若省略表达式列表,则写入一个空行。
例如:
Open
"d:\abc.txt" For Output As #1
Print
"abcd", 5 + 10, 4 < 5, Date '在窗体上输出
Print
Print
"abcd"; 5 + 10; 4 < 5; Date
Print #1,
"abcd", 5 + 10, 4 < 5, Date '在文件中输出
Print #1,
Print #1,
"abcd"; 5 + 10; 4 < 5; Date
Close 1
程序运行后,在窗体上显示和文件abc.txt中的内容如下图所示。

2.Write语句
格式:Write #文件号,[表达式列表]
功能:将数据写入顺序文件中。
说明:表达式列表是要写入文件的数据。若省略表达式列表,则表示写入一个空行。
Write语句和Print语句的主要区别是:用Write语句向文件写入数据时,在数据项之间自动插入逗号。若为字符串数据,则给字符串加上双引号,若为日期或其他类型数据,自动加上“#”分隔。而Print语句写入数据时,系统不会自动添加分隔符。
例如:
Open "d:\cba.txt"
For Output As #3
Write #3,
"abcd", 5 + 10, 4 < 5, Date
Write #3,
Write #3,
"abcd"; 5 + 10; 4 < 5; Date
Close 1
程序运行后,文件cba.txt中的内容如下图所示。在使用write语句写文件时,表达式之间用逗号或分号做分隔符作用是一样的。

3.Input语句
格式:Input #文件号,[变量列表]
功能:从文件号指定的顺序文件中依次读取数据项,存入到变量列表中。字符型数据每项间以逗号或者回车作为分隔;数值型数据每项间以逗号、空格或回车作为分隔。
说明:变量列表中的变量类型应与文件中读取的数据类型相一致。
例如:数据文件d:\a.txt中内容如下图所示。

有如下程序段:
Open "d:\a.txt"
For Input As #1
Input #1,
c1,c2,c3,c4,c5,c6
Close
则读取到变量c1中的数据为字符串“a”,读取到c2中的数据为字符串“b c”,读取到c3中的数据为字符串“d;e”,读取到c4中的数据为整数10,读取到c5中的数据为整数20,读取到c6中的数据为整数30。
4.Line Input语句
格式:Line Input #文件号,[变量]
功能:以行为单位从文件号指定的顺序文件中读取数据,存入到变量中。
说明:从文件中读取的数据将作为一个字符串存储到变量中。
例如:从图12.3所示的d:\a.txt中读取数据
有如下程序段:
Open
"d:\a.txt" For Input As #1
Line Input #1, a
Line Input #1, b
Close
程序运行后,字符型变量a中为字符串“a,b
c,d;e”,字符型变量b中为字符串“10 20,
在读取顺序文件时,只要数据文件是文本文件形式即可,文件的扩展名可以为txt,也可以为其它扩展名,如dat等。
5.Input$函数
格式:Input$(n,#文件号)
功能:返回从指定文件中读取的n个字符。n为整型表达式。
例:若有数据文件d:\b.dat,内容为字符串abcdefghij。程序代码为:
Open "d:\b.dat"
For Input As #5
x$ = Input$(6,
5)
Print x
Close #5
程序运行后,在窗体上显示:abcdef
【例1】数值顺序文件操作。
项目说明:在D盘上有一个顺序文件a.txt,该文件是由25个整数组成,两个数字间由空格分隔,如下图所示。通过顺序文件操作命令读取该文件,将所有数字读取到二维数组arr(5,5)中,并在窗体上显示。

项目分析:打开文件后,利用Input语句逐项读取整数,将数字读取到二维数组中。
项目设计:新建工程,在窗体的Click事件内编写如下代码:
Private Sub
Form_Click()
Dim arr(5, 5) As Integer
Open "d:\a.txt" For Input As #1
For i = 1 To 5
For j = 1 To 5
Input #1,
arr(i, j)
Print arr(i, j);
Next j
Print
Next i
Close #1
End Sub
程序运行结果如下图所示。

文件操作中常用的语句和函数
1.文件指针
文件打开后,系统会自动生成一个指针(隐含),文件的读写就是从这个指针位置开始的。若文件是以Append方式打开,则文件指针指向文件尾。若文件是以Input、Output、Random方式打开,则文件指针指向文件开始位置(文件头)。当文件经过一次读或写操作后,文件指针会自动移到下一个读写操作的位置。
例:若有数据文件d:\b.dat,内容为字符串abcdefghij。程序代码为:
Open "d:\b.dat"
For Input As #5
x = Input$(3, 5)
y = Input$(3, 5)
Close #5
程序运行后,变量x的内容为字符串“abc”,变量y的内容为字符串“def”。
打开文件b.dat后,文件指针指向文件的开始位置,第一次用Input函数读取文件时,将从开始位置的前3个字符赋予了变量x,即“abc”,此时文件指针在字符“d”之前,所以第二次再使用Input函数要求读取3个字符时,即读取了“def”到变量y中。
2.常用语句与函数
⑴ EOF函数
格式:EOF(文件号)
功能:用来测试文件是否结束。返回值为逻辑值。
说明:对于顺序文件,若已到文件尾,则返回True,否则返回False。对于随机文件,当无法读到最后一条记录的全部数据时,返回False。
⑵ LOF函数
格式:LOF(文件号)
功能:该函数的返回值为文件所包含的字节数,即文件的长度。
⑶ Loc函数
格式:Loc(文件号)
功能:对于随机文件,Loc函数返回文件读写当前记录的记录号。对于顺序文件,Loc函数返回读写的记录个数。
⑷ FreeFile函数
格式:FreeFile()
功能:返回空闲的最小文件号。
说明:当应用程序打开的文件较多时,可利用此函数自动查找还未被使用的文件号。
⑸ Seek函数
格式:Seek(文件号)
功能:Seek函数用来返回当前文件指针的位置。
⑹ Seek语句
格式:Seek #文件号,位置
功能:Seek语句用来将文件指针定位到指定的位置。
说明:位置是一个数值表达式。对于顺序文件,位置是从文件开头到指定位置的字节数。对随机文件,位置是指定的记录号。

