1、第第1212章章 数数 据据 文文 件件第第1212章章 数数 据据 文文 件件 大多数的应用程序都需要读写磁盘文件。本章介绍如何大多数的应用程序都需要读写磁盘文件。本章介绍如何建立文件、读取文件、写文件以及文件夹中文件的删除、建立文件、读取文件、写文件以及文件夹中文件的删除、复制、更名等各种操作。复制、更名等各种操作。v12.1 文件的结构与分类文件的结构与分类 文件是指记录在外部介质上的信息的集合,文件的结构文件是指记录在外部介质上的信息的集合,文件的结构是指如何合理地组织数据而形成文件,当然这与文件的类是指如何合理地组织数据而形成文件,当然这与文件的类型有关。型有关。12.1.1 12.
2、1.1 文件的分类文件的分类 根据不同的分类标准,根据不同的分类标准,VB文件可以分为不同的类型。文件可以分为不同的类型。1.按文件性质分类按文件性质分类 根据文件的性质,可分为程序文件和数据文件两大类。根据文件的性质,可分为程序文件和数据文件两大类。1)程序文件:这种文件存放的是可供计算机执行的程序,程序文件:这种文件存放的是可供计算机执行的程序,包括源程序文件和可执行程序文件。包括源程序文件和可执行程序文件。2)数据文件:用来存放运行程序所需的数据,或用来存数据文件:用来存放运行程序所需的数据,或用来存储程序的运行结果。储程序的运行结果。2.按存取方式和结构分类按存取方式和结构分类 根据文
3、件中数据存取方式的不同,可以将数据文件分为根据文件中数据存取方式的不同,可以将数据文件分为顺序文件和随机文件两大类。顺序文件和随机文件两大类。1)顺序文件:数据(通常以记录的形式存放)的写入是顺序文件:数据(通常以记录的形式存放)的写入是一个接一个依次进行的。数据在文件中的存放次序,以及一个接一个依次进行的。数据在文件中的存放次序,以及读出次序与写入数据时的顺序一致,也是从头到尾按序进读出次序与写入数据时的顺序一致,也是从头到尾按序进行的。行的。2)随机文件:数据通常也以记录的形式存放,但与顺序随机文件:数据通常也以记录的形式存放,但与顺序文件不同的是,其每条记录的长度相等,且拥有一个唯一文件
4、不同的是,其每条记录的长度相等,且拥有一个唯一的记录号。的记录号。3.按编码方式分类按编码方式分类 根据文件中存储信息所使用的编码方式,可以将文件分根据文件中存储信息所使用的编码方式,可以将文件分为为ASCII文件和二进制文件。文件和二进制文件。1)ASCII文件:又称为文本文件,它以文件:又称为文本文件,它以ASCII方式存储,方式存储,数值型数据中的每位数字分别使用代表它们的数值型数据中的每位数字分别使用代表它们的ASCII码存码存储,汉字的存储则使用双字节的汉字字符集编码。储,汉字的存储则使用双字节的汉字字符集编码。2)二进制文件:以二进制方式保存信息,该类文件不具二进制文件:以二进制方
5、式保存信息,该类文件不具有可读性,不能使用有可读性,不能使用TYPE命令输出或显示,也不能用文命令输出或显示,也不能用文本编辑器建立或修改,占空间较小。本编辑器建立或修改,占空间较小。12.1.2 12.1.2 文件的结构文件的结构 为了有效地存取数据,数据必须以某种特定的方式存放,为了有效地存取数据,数据必须以某种特定的方式存放,这种特定的方式就是文件的结构。这种特定的方式就是文件的结构。VB的数据文件由记录组的数据文件由记录组成,记录由字段组成,字段由字符组成。成,记录由字段组成,字段由字符组成。1)字符字符(Character):是构成文件的最基本单位,可以是:是构成文件的最基本单位,可
6、以是数字、字母、特殊符号或单一的字节。一个字符通常用一数字、字母、特殊符号或单一的字节。一个字符通常用一个字节存放,一个汉字或全角字符则用两个字节存放。个字节存放,一个汉字或全角字符则用两个字节存放。2)字段字段(Field):又称域,由若干个字符组成,用来表示:又称域,由若干个字符组成,用来表示一项数据。一项数据。3)记录记录(Record):由一组相关的字段组成。例如在通信:由一组相关的字段组成。例如在通信录中,每个人的姓名、单位、住址、电话号码等组成一个录中,每个人的姓名、单位、住址、电话号码等组成一个记录。记录。4)文件文件(File):由记录组成。:由记录组成。v12.2 文件操作语
7、句和函数文件操作语句和函数 在在Visual Basic中,对于数据文件的处理,传统的方法是中,对于数据文件的处理,传统的方法是通过使用通过使用Open语句以及一些相关的语句和函数来实现的。语句以及一些相关的语句和函数来实现的。这些语句和函数,适用于顺序文件、随机文件和二进制文这些语句和函数,适用于顺序文件、随机文件和二进制文件的访问。件的访问。12.2.1 12.2.1 数据文件的操作数据文件的操作 在微型计算机中,数据文件一般为磁盘文件。从磁盘文在微型计算机中,数据文件一般为磁盘文件。从磁盘文件向计算机的内存传送数据,对于计算机来说,属于件向计算机的内存传送数据,对于计算机来说,属于“输输
8、入入”操作,称为操作,称为“读文件读文件”。从计算机的内存向磁盘文件。从计算机的内存向磁盘文件传送数据,则是计算机的传送数据,则是计算机的“输出输出”操作,称为操作,称为“写文件写文件”。为了有效地管理文件的输入输出操作,每一个打开的数为了有效地管理文件的输入输出操作,每一个打开的数据文件中都有一个指针,指向下一次将要读写的数据位置,据文件中都有一个指针,指向下一次将要读写的数据位置,称为称为“文件指针文件指针”或或“记录指针记录指针”。当缺省读写位置时,。当缺省读写位置时,数据的读出或写入总是指向文件指针的当前位置。数据的读出或写入总是指向文件指针的当前位置。数据文件的操作,一般按以下数据文
9、件的操作,一般按以下3个步骤进行:个步骤进行:1)打开(或建立)文件:一个数据文件,首先必须打开打开(或建立)文件:一个数据文件,首先必须打开才能使用。如果文件不存在,在执行某些打开命令时,将才能使用。如果文件不存在,在执行某些打开命令时,将建立一个新文件。建立一个新文件。2)读写文件:执行文件的读写文件:执行文件的“写写”操作,就是把内存中的操作,就是把内存中的数据传输到外部设备(一般为磁盘)并予以存储的过程;数据传输到外部设备(一般为磁盘)并予以存储的过程;执行文件的执行文件的“写写”操作,则是把文件中的数据传输到计算操作,则是把文件中的数据传输到计算机内存的过程。读写文件是数据文件处理的
10、核心部分。机内存的过程。读写文件是数据文件处理的核心部分。3)关闭文件:对于一个不再使用的文件,应执行关闭命关闭文件:对于一个不再使用的文件,应执行关闭命令,以便释放相关的文件缓冲区。令,以便释放相关的文件缓冲区。12.2.2 12.2.2 文件的打开与关闭语句文件的打开与关闭语句1.Open语句语句 在对文件执行任何读写操作之前,必须打开文件。在对文件执行任何读写操作之前,必须打开文件。Open语句用来打开或建立一个文件,分配一个缓冲区供文件进语句用来打开或建立一个文件,分配一个缓冲区供文件进行输入行输入/输出,并决定缓冲区的访问方式。其语法格式为:输出,并决定缓冲区的访问方式。其语法格式为
11、:Open文件名文件名For读写方式读写方式Access存取类型存取类型 锁定类锁定类型型 As#文件号文件号Len=记录长度记录长度2.Close语句语句 Close语句用来关闭语句用来关闭Open语句所打开的输入语句所打开的输入/输出文件。输出文件。其语法格式为:其语法格式为:Close#文件号文件号,#文件号文件号12.2.3 12.2.3 文件访问函数文件访问函数1.EOF函数函数 EOF函数用于测试指定文件的结束状态,通常用来检查函数用于测试指定文件的结束状态,通常用来检查以以Input方式打开的顺序文件。其语法格式为:方式打开的顺序文件。其语法格式为:EOF(文件号文件号)2.Fr
12、eeFile函数函数 FreeFile函数返回指定范围内下一个可用的文件号。其语函数返回指定范围内下一个可用的文件号。其语法格式为:法格式为:FreeFile(区间号区间号)12.2.3 12.2.3 文件访问函数文件访问函数3.Input函数函数 Input函数返回它所读出的所有字符,包括逗号、空格符、函数返回它所读出的所有字符,包括逗号、空格符、引号以及回车符和换行符等,可用于以引号以及回车符和换行符等,可用于以Input方式打开的顺方式打开的顺序文件或以二进制文件方式打开的文件。其语法格式为:序文件或以二进制文件方式打开的文件。其语法格式为:Input(字符个数字符个数,#文件号文件号)
13、4.Len函数函数 Len函数返回字符串表达式中包含字符的数目,或是存函数返回字符串表达式中包含字符的数目,或是存储一个变量所需的字节数。其语法格式为:储一个变量所需的字节数。其语法格式为:Len(字符串表达式字符串表达式)5.Loc函数函数 Loc函数返回一个用函数返回一个用Open语句打开文件的上一次读写位语句打开文件的上一次读写位置。其语法格式为:置。其语法格式为:Loc(文件号文件号)6.LOF函数函数 LOF函数返回用函数返回用Open语句打开文件的大小(以字节为单语句打开文件的大小(以字节为单位)。其语法格式为:位)。其语法格式为:LOF(文件号文件号)7.Seek函数函数 See
14、k函数返回一个用函数返回一个用Open语句打开的文件的当前读写位语句打开的文件的当前读写位置。其语法格式为:置。其语法格式为:Seek(文件号文件号)v12.3 顺序文件的操作顺序文件的操作 顺序文件的打开与关闭由顺序文件的打开与关闭由Open语句和语句和Close语句来实现。语句来实现。打开顺序文件的基本语法格式为:打开顺序文件的基本语法格式为:Open文件名文件名For Input|Output|Append As文件号文件号Len=buffersize 其中参数说明参见其中参数说明参见12.2.2。下面介绍用来对顺序文件进行。下面介绍用来对顺序文件进行读写操作的语句。读写操作的语句。12
15、.3.1 12.3.1 顺序文件的写操作顺序文件的写操作 要将数据写入文本文件,应以要将数据写入文本文件,应以Output或或Append方式打开方式打开该文件。然后使用该文件。然后使用Print#或者或者Write#语句将数据写入文件语句将数据写入文件中。中。1.Print#语句语句 Print#语句将格式化数据写入顺序文件中,其功能与多语句将格式化数据写入顺序文件中,其功能与多次使用的次使用的Print方法类似,只是方法类似,只是Print方法输出的对象是窗体、方法输出的对象是窗体、图片框或打印机,而图片框或打印机,而Print#语句的输出对象是文件。其语语句的输出对象是文件。其语法格式为
16、:法格式为:Print#文件号,文件号,Spc(n)|Tab(n)表达式列表表达式列表,|;【例【例12-1】用】用Print#语句向顺序文件输出数据。语句向顺序文件输出数据。窗体的窗体的Click事件代码:事件代码:Private Sub Form_Click()Open c:out1.txt For Output As#1 Print#1,1;2;3;4;5 用紧凑格式输出数值型数据用紧凑格式输出数值型数据 Print#1,计算机计算机;等级考试等级考试;1;2;3 用紧凑格式输出用紧凑格式输出字符串型数据字符串型数据 Print#1,4,5,12.35,12-76 用标准格式输出用标准格
17、式输出 Print#1,输出一个空行输出一个空行 Print#1,这是用这是用;Pirnt#语句语句;注意,输出列表最后有分号注意,输出列表最后有分号 Print#1,“输出的文件输出的文件”紧凑上一个紧凑上一个Print#语句输语句输出出 Close#1End Sub图图12-1 用用Print#语句写入文件的格式示例语句写入文件的格式示例 运行程序,用鼠标单击窗体后,用运行程序,用鼠标单击窗体后,用Windows的的“记事本记事本”打开文件打开文件“out1.txt”,可以看到文件的内容及其格式,如,可以看到文件的内容及其格式,如图图12-1所示。所示。2.Write#语句语句 与与Pri
18、nt#相同,相同,Write#语句将输出列表指定的数据,语句将输出列表指定的数据,顺序写入文件号所代表的文件中,其语法格式为:顺序写入文件号所代表的文件中,其语法格式为:Write#文件号,文件号,表达式列表表达式列表 用用Write#语句写入的顺序文件具有如下的格式:语句写入的顺序文件具有如下的格式:1)字符型数据,用双引号(字符型数据,用双引号()括起来。)括起来。2)逻辑型数据,保存为逻辑型数据,保存为#TRUE#或者或者#FALSE#。3)日期型数据,采用日期型数据,采用#yyyy-mm-dd hh:mm:ss#的格式,的格式,或将日期部分和时间部分分开处理,其形式为或将日期部分和时间
19、部分分开处理,其形式为#yyyy-mm-dd#和和#hh:mm:ss#。4)各数据项之间以紧凑格式存放,并自动插入分界符各数据项之间以紧凑格式存放,并自动插入分界符(逗号)。(逗号)。5)在输出列表中的最后一个字符写入文件后,自动插入在输出列表中的最后一个字符写入文件后,自动插入回车换行符。回车换行符。【例【例12-2】用】用Write#语句向顺序文件输出数据。语句向顺序文件输出数据。选择选择“新建新建”工程,进入窗体设计器,编写窗体的工程,进入窗体设计器,编写窗体的Click事件代码:事件代码:Private Sub Form_Click()Dim I As Integer,S As Str
20、ing Dim D As Date,B As Boolean Open c:WEXAM26160001out2.txt For Output As#1 以顺序输出方式建立并打开文件以顺序输出方式建立并打开文件 I=100:S=773456 D=Date:B=True Date函数返回系统当前的日期函数返回系统当前的日期 Write#1,I,S,D,B 写入第写入第1条记录条记录 Write#1,这是用这是用Write语句输出的文件语句输出的文件 写入第写入第2条记录条记录 Close#1 关闭文件关闭文件End Sub图图12-2 用用Write#语句写入文件的格式示例语句写入文件的格式示例
21、运行程序,用鼠标单击窗体后,用运行程序,用鼠标单击窗体后,用Windows的的“记事本记事本”打开文件打开文件“out2.txt”,可以看到文件的内容及其格式(图,可以看到文件的内容及其格式(图12-2)。)。Print#语句与语句与Write#语句的区别:语句的区别:Print#语句根据指语句根据指定的格式,将数据写入文件,数据项之间不会自动插入分定的格式,将数据写入文件,数据项之间不会自动插入分界符,而界符,而Write#语句在数据项之间自动插入分界符。语句在数据项之间自动插入分界符。Write#语句适合输出不同类型的数据,特别是当数据写语句适合输出不同类型的数据,特别是当数据写入文件后,
22、还需用其他程序读出进行处理的情况。入文件后,还需用其他程序读出进行处理的情况。Print#语句适合输出文本类型或列表格式的数据,供打印或显示语句适合输出文本类型或列表格式的数据,供打印或显示用。用。【例【例12-3】用】用Write#语句向顺序文件输出语句向顺序文件输出20个随机两位整个随机两位整数。数。窗体的窗体的Click事件代码:事件代码:Private Sub Form_Click()Randomize Open c:WEXAM26160002datain.txt For Output As#1 For i=1 To 20 Write#1,Int(Rnd*90)+10 Next Clo
23、se#1End Sub【例【例12-4】设在工程中有一个标准模块,其中定义了如下】设在工程中有一个标准模块,其中定义了如下记录类型(用户自定义类型):记录类型(用户自定义类型):Type Books Name As String*10 TelNum As String*20End Type 执行下列事件过程代码将在顺序文件中写入一条记录:执行下列事件过程代码将在顺序文件中写入一条记录:Private Sub Command1_Click()Dim b As Books Open c:Person.txt For Output As#1 b.Name=InputBox(输入姓名输入姓名)b.Te
24、lNum=InputBox(输入电话号码输入电话号码)Write#1,b.Name,b.TelNum Close#1End Sub12.3.2 12.3.2 顺序文件的读操作顺序文件的读操作 要读取文本文件的内容,应以要读取文本文件的内容,应以Input方式打开该文件。然方式打开该文件。然后使用后使用Input#或者或者Line Input#语句将文件复制到内存变语句将文件复制到内存变量中。量中。1.Input#语句语句 Input语句从一个打开的顺序文件中读出数据,并将数据语句从一个打开的顺序文件中读出数据,并将数据赋给指定的变量,其语法格式为:赋给指定的变量,其语法格式为:Input#文件
25、号,变量列表文件号,变量列表 通常,用通常,用Write#语句写入文件的数据,可使用语句写入文件的数据,可使用Input#语句读出数据。读数据时,一般不需处理就可直接将数据语句读出数据。读数据时,一般不需处理就可直接将数据指定给变量。指定给变量。【例【例12-5】用】用Input#语句读取例语句读取例12-2所建立文件中的数据,所建立文件中的数据,并将数据显示在窗体上。并将数据显示在窗体上。选择选择“新建新建”工程,进入窗体设计器,编写窗体的工程,进入窗体设计器,编写窗体的Click事件代码:事件代码:Private Sub Form_Click()Dim I As Integer,S As
26、String Dim D As Date,B As Boolean Open c:out2.txt For Input As#1 以顺序输入方式打开文件以顺序输入方式打开文件 Input#1,I,S,D,B 读取第读取第1条记录条记录 Close#1 关闭文件关闭文件 Cls Print 文件中第一个记录为:文件中第一个记录为:Print I,S,D,BEnd Sub 程序运行结果如图程序运行结果如图12-3所示。所示。图图12-3 用用Input#语句读取文件语句读取文件 注意:在用注意:在用Input#语句读取用语句读取用Write#语句写入文件的语句写入文件的数据时,并没有对字符串数据的
27、定界符(数据时,并没有对字符串数据的定界符()作特别的处)作特别的处理,也没有删除日期型数据和布尔型数据的定界符(理,也没有删除日期型数据和布尔型数据的定界符(#)。)。Input#语句在将数据指定给变量时,会自动去掉这些定界语句在将数据指定给变量时,会自动去掉这些定界符,如同符,如同Write#语句在写文件时会根据变量的类型自动添语句在写文件时会根据变量的类型自动添加定界符。加定界符。【例【例12-6】设数据文件】设数据文件datain1.txt和和datain2.txt文件中各有文件中各有20个整数(如例个整数(如例12-3中过程所写),设计程序读入文件中中过程所写),设计程序读入文件中的
28、各的各20个整数,分别放入两个数组个整数,分别放入两个数组Arr1和和Arr2中,然后计中,然后计算:把两个数组中对应下标的元素相加,其结果放入第三算:把两个数组中对应下标的元素相加,其结果放入第三个数组中(即:第一个数组的第个数组中(即:第一个数组的第n个元素与第二个数组的个元素与第二个数组的第第n个元素相加,其结果作为第三个数组的第个元素相加,其结果作为第三个数组的第n个元素。这个元素。这里的里的n为为1、2、.、20),并计算第三个数组各元素之和,),并计算第三个数组各元素之和,最后把所求得的和在窗体上显示出来,并将计算结果存入最后把所求得的和在窗体上显示出来,并将计算结果存入datao
29、ut.txt 文件中。文件中。首先在窗体的通用段声明数组及变量:首先在窗体的通用段声明数组及变量:Option Base 1Dim Arr1(20)As IntegerDim Arr2(20)As IntegerDim s As Integer然后编写读取和写入数据的通用过程。然后编写读取和写入数据的通用过程。读取文件读取文件datain1.txt的的ReadDate1过程代码:过程代码:Sub ReadData1()Open App.Path&datain1.txt For Input As#1 For i=1 To 20 Input#1,Arr1(i)Next i Close#1End S
30、ub 读取文件读取文件datain2.txt的的ReadDate2过程代码:过程代码:Sub ReadData2()Open App.Path&datain2.txt For Input As#1 For i=1 To 20 Input#1,Arr2(i)Next i Close#1End Sub写入文件的写入文件的WriteDate过程代码:过程代码:Sub WriteData(Filename As String,Num As Integer)Open App.Path&Filename For Output As#1 Print#1,Num Close#1End Sub 其中,其中,Ap
31、p.Path表示当前工程所在的文件夹(目录)。表示当前工程所在的文件夹(目录)。最后编写事件过程代码。最后编写事件过程代码。编写命令按钮编写命令按钮C1(读入数据)的(读入数据)的Click事件代码:事件代码:Private Sub C1_Click()Call ReadData1 Call ReadData2End Sub编写命令按钮编写命令按钮C2(计算)的(计算)的Click事件代码:事件代码:Private Sub C2_Click()Dim Arr3(20)As Integer For i=1 To 20 Arr3(i)=Arr1(i)+Arr2(i)Next s=0 For i=1
32、 To 20 s=s+Arr3(i)Next Cls Print Print 各元素之和为:各元素之和为:,sEnd Sub图图12-4 运行程序运行程序编写命令按钮编写命令按钮C3(存盘)的(存盘)的Click事件代码:事件代码:Private Sub C3_Click()WriteData dataout.txt,sEnd Sub 运行程序,依次用鼠标单击命令按钮运行程序,依次用鼠标单击命令按钮“读入数据读入数据”、“计算计算”、“存盘存盘”(如图(如图12-4)后,所得结果保存在当)后,所得结果保存在当前文件夹的前文件夹的dataout.txt文件中。文件中。2.Line Input#语
33、句语句 Line Input#语句从顺序文件中读出一行,并把它赋给语句从顺序文件中读出一行,并把它赋给一个字符串变量,其语法格式为:一个字符串变量,其语法格式为:Line Input#文件号,字符串变量文件号,字符串变量 其中,文件号的含义同上,字符串变量用来接受从文件其中,文件号的含义同上,字符串变量用来接受从文件中读出的一行字符。中读出的一行字符。Line Input#语句通常用来读取用语句通常用来读取用Print#语句写入的文语句写入的文件。它一次从文件中读取一行字符,直到遇到回车符为止。件。它一次从文件中读取一行字符,直到遇到回车符为止。回车符将被忽略,不会附加到字符串上。回车符将被忽
34、略,不会附加到字符串上。Line Input#语语句也可用来读取以句也可用来读取以ASCII码存放在磁盘上的各种源程序文码存放在磁盘上的各种源程序文件以及文本文件等。件以及文本文件等。【例【例12-7】在当前目录中有顺序文件】在当前目录中有顺序文件in7.txt,文件中有几文件中有几行汉字行汉字(如图(如图12-5所示)。所示)。在窗体上画一个文本框,名称在窗体上画一个文本框,名称为为Text1,能显示多行;再画一个命令按钮,名称为,能显示多行;再画一个命令按钮,名称为C1,标题为标题为“存盘存盘”。并编写适当的事件过程,使得在加载窗。并编写适当的事件过程,使得在加载窗体时,把体时,把in7.
35、txt文件的内容显示在文本框中,然后在文本文件的内容显示在文本框中,然后在文本的最前面手工插入一行汉字:的最前面手工插入一行汉字:“计算机等级考试计算机等级考试”。最后。最后单击单击“存盘存盘”按钮,可以把文本框中修改过的内容存到文按钮,可以把文本框中修改过的内容存到文件件out7.txt中(如图中(如图12-6所示)。所示)。图图12-5 顺序文件顺序文件in7.txt 图图12-6 读取与写入文本读取与写入文本 程序代码:程序代码:1)窗体的窗体的Load事件代码可以读入文件事件代码可以读入文件in7.txt:Private Sub Form_Load()Open App.Path&in7
36、.txt For Input As#1 a=Do Until EOF(1)Line Input#1,b a=a&b&Chr(13)&Chr(10)Loop Close#1 Text1.Text=aEnd Sub 2)命令按钮命令按钮C1的的Click事件代码可以将文本框中的内容写事件代码可以将文本框中的内容写入文件入文件Out7.txt:Private Sub C1_Click()Open App.Path&out7.txt For Output As#1 Print#1,Text1.Text Close#1End Sub 程序运行结果如图程序运行结果如图12-6所示。所示。【例【例12-8】
37、一个简易文本编辑器,具有创建、编辑、保存】一个简易文本编辑器,具有创建、编辑、保存普通文本文件的功能,如图普通文本文件的功能,如图12-7所示。所示。为了使改变窗体大小的时候文本框能随之改变,编写窗为了使改变窗体大小的时候文本框能随之改变,编写窗体的体的Resize事件代码:事件代码:Private Sub Form_Resize()Text1.Left=0 Text1.Top=0 Text1.Height=Form1.ScaleHeight Text1.Width=Form1.ScaleWidth-Picture1.WidthEnd Sub图图12-7 简易的文本编辑器简易的文本编辑器 然后
38、编写菜单控键数组然后编写菜单控键数组File()的的Click事件代码:事件代码:Private Sub File_Click(Index As Integer)n=Index Select Case n Case 0 新建新建 Text1.Text=Form1.Caption=未命名未命名 Case 1 打开打开 CommonDialog1.ShowOpen 显示显示打开打开公共对话框公共对话框 fname=CommonDialog1.FileName If fname Then Text1.Text=Open fname For Input As#1 b=Do Until EOF(1)Li
39、ne Input#1,nextline b=b&nextline&Chr(13)&Chr(10)Loop Close#1 Text1.Text=b End If Form1.Caption=fname Case 2 保存保存 If Form1.Caption=未命名未命名 Or Form1.Caption=Then CommonDialog1.ShowSave 显示显示另存为另存为公共对话框公共对话框 fname=CommonDialog1.FileName Else fname=Form1.Caption End If If fname Then Open fname For Output
40、As#1 Print#1,Text1.Text Close#1 End If Case 3 另存另存 CommonDialog1.ShowSave 显示显示另存为另存为公共对话框公共对话框 fname=CommonDialog1.FileName If fname Then Open fname For Output As#1 Print#1,Text1.Text Close#1 End If Case 4 Text1.Text=End End Select Text1.SetFocusEnd Subv12.4 随机文件的操作随机文件的操作 随机文件中的一行数据称为一笔记录。随机文件对文件随机
41、文件中的一行数据称为一笔记录。随机文件对文件的读写顺序没有限制,可以随意读写某一条记录。这就要的读写顺序没有限制,可以随意读写某一条记录。这就要求记录的长度是固定的,以便由记录号来定位。随机文件求记录的长度是固定的,以便由记录号来定位。随机文件的读写速度较快,但其占用空间较大。的读写速度较快,但其占用空间较大。随机文件的打开与关闭仍由随机文件的打开与关闭仍由Open语句和语句和Close语句来实语句来实现。打开随机文件的基本语法格式为:现。打开随机文件的基本语法格式为:Open文件名文件名For Random As文件号文件号Len=记录长度记录长度12.4.1 12.4.1 随机文件的读写操
42、作随机文件的读写操作 对打开的随机文件中的记录进行编辑,要先把记录从文对打开的随机文件中的记录进行编辑,要先把记录从文件读到内存变量,然后改变各变量的值,最后,把变量写件读到内存变量,然后改变各变量的值,最后,把变量写回该文件。回该文件。1.Get#语句语句 把记录读入变量使用把记录读入变量使用Get#语句,其语法格式为:语句,其语法格式为:Get#文件号,记录号,变量名文件号,记录号,变量名 其中,文件号是打开文件时指定的文件句炳,记其中,文件号是打开文件时指定的文件句炳,记录号是要读入的记录号数;而变量名则是接收记录录号是要读入的记录号数;而变量名则是接收记录内容的记录型变量名,一般声明为
43、用户定义类型。内容的记录型变量名,一般声明为用户定义类型。12.4.1 12.4.1 随机文件的读写操作随机文件的读写操作2.Put#语句语句 使用使用Put#语句可以把数据写入或替换随机文件中的记录,语句可以把数据写入或替换随机文件中的记录,其语法格式为:其语法格式为:Put#文件号文件号,记录号记录号,变量名变量名 其中,文件号是打开文件时指定的文件句炳,记其中,文件号是打开文件时指定的文件句炳,记录号是要写入或替换的记录位置,变量名是接收记录号是要写入或替换的记录位置,变量名是接收记录的内容的记录型变量名。录的内容的记录型变量名。【例【例12-9】利用随机文件保存学生的成绩,可以浏览或编
44、】利用随机文件保存学生的成绩,可以浏览或编辑(读取、修改、写入)学生的学号、姓名以及三门功课辑(读取、修改、写入)学生的学号、姓名以及三门功课的成绩,如图的成绩,如图12-8所示。所示。图图12-8 简易的学生成绩管理软件简易的学生成绩管理软件 1)建立应用程序用户界面与设置对象属性。建立应用程序用户界面与设置对象属性。选择选择“新建新建”工程,进入窗体设计器,首先增加两个框工程,进入窗体设计器,首先增加两个框架架Frame1Frame2和三个命令按钮和三个命令按钮Command1Command3。选定。选定Frame1,在其中增加一个文本框数组,在其中增加一个文本框数组Text1(0)Tex
45、t1(4)、和五个标签。选定、和五个标签。选定Frame2,在其中增,在其中增加一个列表框加一个列表框List1。设置框架、文本框、标签、列表框和命令按钮的属性如设置框架、文本框、标签、列表框和命令按钮的属性如图图12-8所示。所示。2)编写代码。编写代码。首先在窗体的通用段创建用户定义类型(记录类型)并首先在窗体的通用段创建用户定义类型(记录类型)并声明变量:声明变量:Private Type cj xm As String*6 xh As String*6 sx As Integer yw As Integer wy As IntegerEnd TypePrivate da As cj编写
46、编写“读取读取”按钮的按钮的Click事件代码:事件代码:Private Sub Command1_Click()Dim sx As Single,yw As Single,wy As Single FileName=App.Path&xsda2.dat Open FileName For Random As#1 Len=Len(da)打开随机数据文件打开随机数据文件 lastrec=LOF(1)/Len(da)List1.Clear For n=1 To lastrec Get#1,n,da xh=Format(da.xh,)xm=Format(RTrim(da.xm),)yw=Format
47、(da.yw,#)wy=Format(da.wy,#)sx=Format(da.sx,#)msg=xh&yw&wy&sx&xm List1.AddItem msg Next Command1.Enabled=FalseEnd Sub 编写编写“保存保存”按钮的按钮的Click事件代码:事件代码:Private Sub Command2_Click()recnum=List1.ListIndex da.xh=Text1(0).Text da.xm=Text1(1).Text da.yw=Text1(2).Text da.wy=Text1(3).Text da.sx=Text1(4).Text x
48、h=Format(da.xh,)xm=Format(RTrim(da.xm),)yw=Format(da.yw,#)wy=Format(da.wy,#)sx=Format(da.sx,#)msg=xh&yw&wy&sx&xm Put#1,recnum+1,da List1.RemoveItem recnum List1.AddItem msg,recnum Command2.Enabled=FalseEnd Sub 编写编写“关闭关闭”按钮的按钮的Click事件代码:事件代码:Private Sub Command3_Click()Close#1 Unload MeEnd Sub 编写列表框的
49、编写列表框的Click事件代码:事件代码:Private Sub List1_Click()If List1.ListIndex -1 Then n=List1.ListIndex+1 Get#1,n,da Text1(0).Text=da.xh Text1(1).Text=da.xm Text1(2).Text=da.yw Text1(3).Text=da.wy Text1(4).Text=da.sx End If Command2.Enabled=TrueEnd Sub12.4.2 12.4.2 随机文件中记录的增加与删除随机文件中记录的增加与删除1.增加记录增加记录 在随机文件中添加记录
50、,是指向文件的末尾添加记录。在随机文件中添加记录,是指向文件的末尾添加记录。其方法是,把记录号的值设置为比文件中的记录数多其方法是,把记录号的值设置为比文件中的记录数多1,然后使用然后使用Put语句。语句。【例【例12-10】在例】在例12-9中增加一个添加新记录的功能,如图中增加一个添加新记录的功能,如图12-9所示。所示。设计步骤如下:设计步骤如下:只需在例只需在例12-9中增加一个命令按钮中增加一个命令按钮Command4,并编写,并编写其其Click事件代码:事件代码:Private Sub Command4_Click()lastrec=LOF(1)/Len(da)+1 da.xh=