电子光盘课件章_第1页
电子光盘课件章_第2页
电子光盘课件章_第3页
电子光盘课件章_第4页
电子光盘课件章_第5页
已阅读5页,还剩55页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第14章数据文件

14.1文件概述

计算机文件是外存中信息的集合,各种信息都可以以文件的形式永久保存,信息的性质不同,文件的性质也不同。例如窗体文件存储窗体信息,包括其中的控件和程序代码数据文件保存程序中用到的数据和产生的结果文件中的数据必须读到内存中才能进行处理,处理的过程取决于算法,这是以前各章所介绍的内容文件操作涉及的是如何进行内存和文件之间的数据交换,这种操作过程并不涉及复杂的算法,只涉及文件中数据的格式,和文件操作的语句与函数操作系统对文件进行管理每个文件用一个文件名作为文件的标识文件名后面还可以有一个扩展名,用于按文件内容来区分文件的种类例如,“.txt”表示文本文件,“.doc”表示Word文档,“.frm”表示VisualBasic的窗体文件扩展名只是默认的约定,并不强制代表该种类文件。VisualBasic通过操作系统按文件名访问文件应用程序对文件中数据的操作

应用程序对文件中数据的操作主要有两种从文件中读取数据到内存中,这一过程称为“读”或“取”。把内存中的数据存储到文件中,这一过程称为“写”或“存”。对文件中数据所进行的处理是在内存中进行的,数据处理本身与文件没有关系为了实现文件数据的读和写操作,还要进行一些辅助工作,例如打开或创建文件确定文件的读写位置关闭文件文件结构

文件结构是指文件中数据的逻辑组织方式VisualBasic文件由记录组成,记录由字段组成,字段由字符组成字符是构成文件的最基本单位,可以是西文字符,也可以是汉字字段,也称域

字段由若干个字符组成,用来表示一项数据,例如一个姓名,一个电话号码等记录由一组相关的字段组成,例如通信录中,每个人的姓名、单位、地址、电话号码、邮政编码等构成一个记录有时,记录中也可以只含有一个字段文件文件由记录构成,一个文件含有一个或一个以上的记录,例如在通信录文件中有100个人的信息,每个人的信息是一个记录,100个记录构成一个文件数据文件种类

根据数据的存取方式,可分为顺序文件和随机文件顺序文件按文件中记录排列的顺序存取记录的方式称为顺序访问,只能进行顺序访问的文件称为顺序文件

顺序文件的特点只知道第一个记录的存放位置,其他记录的位置无从知道,因此,只能从文件头开始,一个记录一个记录地顺序读取或存储为了修改文件中的某个记录,必须把整个文件读入内存,修改完后再重新写入磁盘在一次使用期间,只能读或只能写,而不能边读边写。如果要修改某条记录,需要先读入所有记录,然后在内存中修改该条记录,最后再按原记录顺序把所有记录写入文件。如果只读入它前面的所有记录和要修改的记录,再写入文件时,被修改记录后面的记录就全部丢失每条记录的实际长度可以不同,使用方便,还可以节省外存数据文件种类随机文件可以随机读写某条记录的访问方式称为随机访问,允许随机访问的文件称为随机文件随机文件的特点所有记录是等长的,只要给出记录的顺序号,就可以直接读或写该条记录修改非常方便,可以直接读取要修改的记录并修改,再写到它的原有位置上去,对其他记录没有影响在一次使用期间,可以边读边写随机文件也可以顺序读写数据的存取较为灵活、方便,速度较快,容易修改有可能占用较大空间数据文件种类根据数据的编码方式,可以分为文本文件和二进制文件文本文件,也称为ASCII文件文件中存储的都是字符的编码,例如西文字符的ASCII码和汉字编码文本文件可以用文本编辑软件直接编辑、保存二进制文件除文本文件外的其他数据文件被称为二进制文件

说明实际上所有文件的内容在磁盘上都是以二进制数存储的。只是文本文件中的二进制数被当作字符的ASCII码和汉字编码在VisualBasic中分别用不同的语句实现文本文件的读写和二进制文件的读写写文本文件时,自动把所要写的各种类型的数据都转换为字符串写入文件(存入文件的是每个字符的编码)读文本文件时,把读出的二进制数当作字符的编码,构成字符串数据,再转换为接收数据的变量的数据类型并放入该变量读写二进制文件的语句则不进行上述转换14.2文件的打开与关闭

数据文件的操作步骤打开(或建立)文件数据文件必须先打开或建立后才能使用,如果一个文件已经存在,则打开该文件;如果不存在,则建立该文件打开文件就是在内存中开辟一个缓冲区,并把这个缓冲区与要使用的文件相关联。这一步骤相当于现实工作中打开文件柜拿出文件的操作进行读、写操作应用程序对文件的读或写都是针对缓冲区的。这一步骤相当于现实工作中的阅读或书写文件通常在读文件之后,写文件之前还有数据处理的步骤,它相当于实际工作中利用文件中的信息进行分析、处理、运算、决策等工作关闭文件关闭文件时会把缓冲区中还未写入文件的数据写到文件中,然后释放缓冲区。这一步骤类似于现实工作中把文件再放回到文件柜中的操作文件操作完毕,一定要关闭文件,否则有可能丢失部分数据

14.2.1文件的打开(建立)Open语句用于打开或建立一个文件,格式:Open文件说明[For方式]

[Access存取类型]As[#]文件号[Len=记录长度]说明Open、For、Access、As、Len为关键字文件说明:字符串,是文件名(包含路径)方式:指定文件的输入输出方式,取下面关键字之一:Output——顺序输出方式。如果文件不存在,就建立文件;如果文件已经存在,则打开文件并清除文件中原有内容,以后写入的数据从文件开始处顺序写入Input——顺序输入方式,如果文件不存在,则产生错误Append——顺序追加输出方式。与Output类似,不同的是如果文件已经存在,则保留文件原有内容,以后写入的数据从文件尾开始追加Random——随机存取方式(默认方式),可以用Access指定存取类型,如果不指定,则为读写模式(即可读也可写)Binary——二进制存取方式,与Random模式类似,但读写的是1个或多个字节文件的打开(建立)存取类型:放在关键字Access之后,用来指定访问文件的类型,可以是下列关键字之一Read——只读文件Write——只写文件ReadWrite——读写文件,只对随机存取、二进制存取及用Append方式打开的文件有效文件号:整型表达式,值在1~511范围内执行Open语句时,文件号与打开的文件相关联,之后的文件操作通过文件号与文件发生关系同时打开文件的文件号不能相同记录长度:整型表达式,值不能超过32767字节对于随机文件,用于设置记录长度对于顺序文件,该值是缓冲字符数,默认为512字节对于二进制文件,将忽略Len子句Open"Price.dat"ForOutputAs#1在当前路径下建立并打开一个新的数据文件“Price.dat”,文件号为1;如果文件已存在,打开该数据文件,新写入的数据将覆盖原来的数据Open"Price.dat"ForAppendAs#1打开当前路径下已存在的数据文件“Price.dat”,新写入的记录附加到文件的后面,原来的数据仍在文件中如果该文件名不存在,则建立一个新文件Open"Price.dat"ForInputAs#1打开已存在的数据文件,以便从文件中读出记录打开文件的例子(一)

打开文件的例子(二)Open"Price.dat"ForRandomAs#1在当前路径下按随机方式打开(已存在的)或建立一个随机文件,记录长度的缺省值为128Open"c:\abc\abcfile.dat"ForRandomAs#1Len=256用随机方式打开C盘上abc目录下的随机文件,记录长度为256字节Filename$="A:Dtat.art"OpenFilename$ForAppendAs#3先把文件名和路径A:Dtat.art赋给字符串变量Filename,然后用该变量指定文件名和路径打开该顺序文件,文件号为314.2.2文件的关闭Close语句用来结束文件的输入输出操作,用过文件号关闭指定文件格式Cloase[[#]文件号][,[#]文件号]...例如:Close#1或Close#1,#5再如:Close关闭所有已经打开的数据文件说明Cloase具有两方面的作用把文件缓冲区中的所有数据写到文件中释放与该文件相联系的文件号,以供其他Open语句使用如果不指定文件号(只写Cloase),则把所有打开的文件统统关闭除Close语句外,在程序结束时将自动关闭所有打开的数据文件文件操作完毕,一定要关闭文件,否则有可能丢失部分数据14.3文件操作语句和函数

14.3.1文件指针每个文件被成功打开以后,会有一个隐含的“文件指针”指向文件中的数据不论采用哪种文件访问方式,每一次文件读写都从文件指针所指的位置开始用Append模式打开文件后,文件指针指向文件的结尾;用其他模式打开文件后,文件指针指向文件的开头只要能够移动文件指针,就可以在任何位置随机读写数据了在程序中每读或写一个数据,文件指针会自动移到刚读写完的数据的后面,所以不需人为移动文件指针,只需不断读或写数据,就可以实现文件的顺序读写文件指针的定位Seek语句把文件指针移到指定位置(即下一个读或写的位置)Seek语句的格式Seek#文件号,位置其中,“位置”是一个数值表达式,表示下一个要读写的位置,其值在1~(231-1)范围内Seek函数格式:Seek(文件号)作用:返回文件指针的当前位置说明对于用Input、Output或Append方式打开的文件,“位置”是从文件开头到“位置”为止的字节数对于用Random方式打开的文件,“位置”是一个记录号14.3.2其他函数

FreeFile函数返回一个在程序中没有使用的文件号例如:Filenum=FreeFile则变量Filenum中是一个没有被占用的文件号Loc函数格式:Loc(文件号)作用对于随机文件,返回对随机文件读或写的最后一个记录的记录号(当前读写位置的前一个记录)对于顺序文件,返回文件被打开以来读或写的记录个数

LOF函数格式:LOF(文件号)作用:返回由文件号所代表的文件的长度(即字节数),如果返回值为0,表示是一个空文件其他函数(二)EOF函数格式:EOF(文件号)作用:测试文件是否结束返回值:True::已经到文件尾,这时不应再继续读入数据False:未到文件尾例如,通常用下面的循环读入文件的所有内容(即一直读,直到文件尾)DoWhileNotEOF(1)'文件读写语句Loop14.4顺序文件

顺序文件的写操作用Print#语句或Write#语句来实现Print#语句格式:Print#文件号,[表达式表][;|,]]Print#语句的格式除多了一个“#文件号,”外,与第5章中Print方法的格式完全一样Print#语句的输出结果与输出格式也与Print方法的输出结果和输出格式相同,不同的是后者输出到对象上,而前者输出到文件号所代表的文本文件中例如:Print#1,A,B,C把3个变量A、B、C中的数据转换为字符串输出到文件号1所代表的顺序文件中Print#语句的输出格式与Print方法的输出格式一致,但文件号后面的“,”与输出格式无关14.4.1顺序文件的写操作

【例14.2】用Print#语句向文件中写入数据

事件过程PrivateSubForm_Click()Open"c:\temp\tel.dat"ForOutputAs#1Tpname$=InputBox$("请输入姓名:","数据输入")tptel$=InputBox$("请输入电话号码:","数据输入")TpAssr$=InputBox$("请输入地址:","数据输入")Print#1,Tpname$,tptel$,TpAssr$Close#1EndSub当输入的姓名、电话、地址分别是“张三”、“67891234”、“中关村12号”时,文件中数据的格式如下图所示,即:在文件中的格式与输出到屏幕上的格式是一致的

Write#语句格式:Write#文件号,表达式表例如:

Write#1,A,B,C把3个变量A、B、C的值写入文件号为1的顺序文件中功能:计算表达式表中的每个表达式的值,依次写到文件中去,最后再向文件写一个回车和换行符。如果省略表达式表,则只向文件输出一个回车和换行符说明:“表达式表”中的各项以逗号分开Write#语句与Print#语句的功能基本相同,其主要区别有两点在文件中用紧凑格式存放,数据之间自动加入逗号分隔,字符串数据自动用双引号括起来,逻辑型数据自动用“#”字符括起来用Write#语句写入的正数的前面没有空格在磁盘上建立一个电话号码文件,存放单位名称和该单位的电话号码事件过程

PrivateSubForm_Click()Open"a:\tel.dat"ForOutputAs#1unit$=InputBox$("Enterunit:")WhileUCase(unit$)<>"DONE"tel$=InputBox$("Telephonenumber:")Write#1,unit$,tel$unit$=InputBox$("Enterunit:")WendClose#1EndEndSub如果输入的3组数据分别是“人事科”,“2134”、“财务科”,“2567”和“销售科”,“2285”,则文件存储格式如图所示,其中双引号、逗号、回车换行符都是自动添加的【例14.3】用Weite#语句写文件【例14.4】写多个学生数据到文件(一)从键盘上输入4个学生的数据,然后把它们存放到磁盘文件中实现学生的数据包括姓名、学号、年龄、住址,应该用一个记录类型来定义创建一个标准模块(该模块以文件名“exam14_4.bas”存盘),在其中定义记录类型如下:TypestustnameAsString*10numAsIntegerageAsIntegeraddrAsString*20EndType注:上述代码也可与下面的代码一同放在窗体模块中,但放在标准模块便于与其他工程共享。见【例14.5】【例14.4】写多个学生数据到文件(二)在窗体模块中编写下面的代码:OptionBase1PrivateSubForm_Click()Staticstud()Asstu '也可用Dim声明数组Open"c:\temp\stu_list"ForOutputAs#1n=InputBox("enternumberofstudent:")ReDimstud(n)AsstuFori=1Tonstud(i).stname=InputBox$("EnterName:")stud(i).num=InputBox("Enternumber:")stud(i).age=InputBox("Enterage:")stud(i).addr=InputBox$("Enteraddress:")Write#1,stud(i).stname,stud(i).num,stud(i).age,stud(i).addrNextiClose#1EndEndSub【例14.4】写多个学生数据到文件(三)说明本例使用了动态数组运行时从键盘输入4条记录,分别是:王大力、20011、20、3号楼204室张虹、20012、19、3号楼205室向荣、20013、20、3号楼208室钟华、20014、21、3号楼209室数据在文件中的格式如下图所示14.4.2顺序文件的读操作

顺序文件的读操作由Input#语句或LineInput#语句或Input函数来实现Input#语句格式:Input#文件号,变量表功能:从顺序文件中读出数据项,把这些数据项依次赋给变量表中的变量例如:Input#1,A,B,C从文件当前位置读出3个数据项,依次赋给A、B、C三个变量说明“变量表”中的变量可以是各种类型的变量或数组元素,文件中读出数据的类型应与这些变量依次匹配Input#语句在读每个数据项(字段)时,忽略每个数据的前导空格、回车或换行符,把遇到的第一个非空格、非回车和换行符作为数值的开始,遇到空格、回车或换行符则认为数值结束如果希望读出的字符串中含有空格,则写文件时必须把含空格的字符串放在双引号中(例如用Write#语句写文件)【例14.5】读学生数据文件(一)把【例14.4】中建立的学生数据文件(Stu_list)读到内存,并在窗体上显示出来实现学生数据需要存放在【例14.4】中定义的记录类型变量中,为避免重复定义类型,可把【例14.4】中的标准模块添加到本工程中添加的方法选菜单“工程”、“添加文件”在弹出的对话框中选文件“exam14_4.bas”编写下面的程序代码【例14.5】读学生数据文件(二)PrivateSubForm_Click()Staticstud()AsstuOpen"c:\temp\stu_list"ForInputAs#1n=InputBox("enternumberofstudent:")ReDimstud(n)AsstuFontSize=12Print"姓名";Tab(21);"学号";Tab(30);"年龄";Tab(40);"住址"PrintFori=1TonInput#1,stud(i).stname,stud(i).num,stud(i).age,stud(i).addrPrintstud(i).stname;Tab(20);stud(i).num;Tab(30);stud(i).age;Tab(40);stud(i).addrNextiClose#1EndSub【例14.5】读学生数据文件(三)说明程序运行后,单击窗体,在输入对话框中输入4,然后单击“确定”按钮,执行结果如下图所示LineInput#语句LineInput#语句格式LineInput#文件号,字符串变量功能LineInput#语句从顺序文件中读取一个完整的行,并把整行赋给字符串变量特点读入的字符中可以包括双引号、逗号和空格,但不包括回车符和换行符对于读取无规律的纯文本文件(例如各种程序语言源程序文件),使用LineInput#语句比较适合LineInput#语句也可用来复制文本文件【例14.7】复制文本文件(一)

把一个磁盘文件的内容读到内存并在文本框中显示出来,然后把该文本框中的内容存入另一个磁盘文件首先用字处理程序(例如“记事本”)建立一个名为“Smtext1.txt”的文件(该文件存放在D盘的test目录下),内容如下图在窗体上建立一个文本框,在属性窗口中把该文本框的MultiLine属性设置为True,然后编写如下的事件过程【例14.7】复制文本文件(二)PrivateSubForm_Click()Open"d:\test\smtext1.txt"ForInputAs#1Text1.FontSize=14Text1.FontName="黑体"DoWhileNotEOF(1)LineInput#1,aspect$whole$=whole$+aspect$+Chr$(13)+Chr$(10)LoopText1.Text=whole$Close#1Open"d:\test\smtext2.txt"ForOutputAs#1Print#1,Text1.TextClose#1EndSub【例14.7】复制文本文件(三)说明为避免系统中未安装“幼圆”字体而产生错误,本例把字体改为“黑体”每循环一次,LineInput#语句把文件中的一行字符读入变量aspect$,然后与回车、唤行符(Chr$(13)+Chr$(10))一起连接到变量Whole$中函数EOF(1)可以判断是否读到了文件尾,用于控制循环注意:EOF(1)中的1是文件号,不能加“#”程序运行后的屏幕输出如下图所示Input$函数Input$函数格式:Input$(n,#文件号)功能:返回从指定文件中读出的n个字符的字符串,即,可以从数据文件中读取指定数目的字符例如:x$=Input$(100,#1)从文件号为1的文件中读取100个字符,赋给变量X$Input函数把顺序文件中的内容当作无格式的字符流,不论是代表有效数据的字符,还是代表文本格式的字符(例如分隔符,回车符和换行符等)都可以读取【例14.8】在文件中查找字符串(一)

编写程序,在文件中查找指定的字符串,以在DOS下批处理文件autoexec.bat中查找字符串为例,要查找的字符串从键盘输入思路把整个文件读入内存,放到一个变量中,然后在这个变量中查找所需要的字符串程序PrivateSubForm_Click()Q$=InputBox$("请输入要查找的字符串:")Open"c:\autoexec.bat"ForInputAs#1X$=Input$(LOF(1),1)'把整个文件内容读入变量X$中

Closey=InStr(1,X$,Q$)Ify<>0ThenPrint"找到字符串";Q$ElsePrint"未找到字符串";Q$EndIfEndSub14.5随机文件

随机文件的特点记录是定长记录,只有给出记录号n,才能通过[(n-1)×记录长度]计算出该记录与文件首记录的相对地址,因此,在用Open语句打开文件时必须指定记录的长度随机文件的读写以记录为单位随机文件中存储的内容不是字符的编码,存取数据时不进行编码的转换,也不能用文本编辑软件编辑或查看打开随机文件后,既可读也可写通常,每个记录划分为若干个数据项,每个数据项的长度等于相应的变量的长度,但也可以只有一个数据项如果记录含有多个数据项,一般用Type...EndType语句来定义记录的类型14.5.1随机文件的打开与读写操作

由于需要读写的记录一般放在记录类型的变量中,所以在打开文件之前,要用Type...EndType语句定义记录类型定义数据类型Type...EndType语句通常在标准模块中,如果放在窗体模块中,在前面应加上关键字Private,然后用该类型定义变量或数组例如TypeRecordTypeEmNameAsString*10UnitAsString*15AgeAsIntegerSalaryAsSingleEndTypeDimrecordvarAsRecordType打开与关闭随机文件

打开随机文件也使用Open语句,但打开时通常指定记录长度可以使用Len()函数返回一个记录类型数据的长度(即文件中一条记录的长度)例如x=Len(Recordvar)打开随机文件的一般格式为:Open"文件名称"ForRandomAs#文件号[Len=记录长度]例如Open“File.dat"ForRandomAs#1Len=Len(Recordvar)如果省略“Len=记录长度”,则记录的默认长度为128字节关闭随机文件与关闭顺序文件一样,使用Close语句例如:Close#1随机文件的写操作

随机文件的写操作通过Put语句来实现,其格式为:

Put#文件号,[记录号],变量功能把变量中的记录(长度与打开文件时指定的记录长度一致)写到文件中指定记录号的位置处,并把文件指针移到下一条记录的开始位置如果在写入位置已有记录,则原有记录被新写入的记录覆盖说明“记录号”的取值范围为1到231-1如果省略“记录号”,则在文件指针所在的位置写本条记录省略“记录号”后,逗号不能省略。例如:

Put#2,,Filebuff随机文件的读操作

随机文件的读操作通过Get语句来实现,其格式为:

Get#文件号,[记录号],变量功能从文件中指定记录号的位置处读入一条记录到变量中,并把文件指针移到下一条记录的开始位置说明“记录号”的取值范围为1到231-1如果省略“记录号”,则在文件指针所在的位置读本条记录省略“记录号”后,逗号不能省略。例如:

Get#1,,Filebuff【例14.9】随机文件的读取建立一个随机存取的工资文件,然后读取文件中的记录每条记录含姓名、单位、年龄、工资等4个数据项定义数据类型建立一个标准模块,在该模块中定义如下的记录类型TypeRecordTypeEmNameAsString*10UnitAsString*15AgeAsIntegerSalaryAsSingleEndType记录类型RecordType定义在标准模块中,便于在不同工程中共享为了记载目前已经建立了几条记录,在窗体模块中定义一个窗体级变量DimrecordnumberAsInteger定义一个RecordType类型窗体级变量用于读或写一条记录DimrecordvarAsRecordType注:为了满足信息隐蔽的原则,也可以在每个使用此变量的过程中分别定义此变量【例14.9】——按顺序写一条记录用一个通用过程来实现文件的写操作SubFile_Write()Dorecordvar.EmName=InputBox$("职工姓名:")recordvar.Unit=InputBox$("所在单位:")recordvar.Age=InputBox("职工年龄:")recordvar.Salary=InputBox("职工工资:")recordnumber=recordnumber+1Put#1,recordnumber,recordvaraspect$=InputBox$("More(Y/N)?")LoopUntilUCase$(aspect$)="N"EndSub说明每调用一次本过程,从键盘接受一条记录的数据,放入记录型变量recordvar中,再用Put语句写入文件recordnumber中是记录号(初始值为0),在写记录之前,recordnumber加1,保证本记录追加在文件的后面连续调用此过程,将以顺序方式把记录写入随机文件在任何时候调用这一函数都可在文件尾添加记录,前提是变量recordnumber中是最后一条记录的记录号【例14.9】——按顺序读记录用一个通用过程来实现文件的读操作SubFile_read1()ClsFontSize=12Fori=1TorecordnumberGet#1,i,recordvarPrintrecordvar.EmName,recordvar.Unit,Printrecordvar.Age,recordvar.Salary,Loc(1)NextiEndSub说明窗体级变量recordnumber中存放着顺序写入文件时的最大文件号,以此来控制循环;此外,也可以用EOF()函数来控制循环利用循环依次改变i的值实现顺序读记录,由于每读入一条记录后,文件指针会自动后移,在Get语句中省略i(但不能省略逗号)的效果不变记录读到变量recordvar中,再把每个元素输出到窗体上【例14.9】——随机方式读记录用一个通用过程来实现文件的随机读操作SubFile_read2()Cls:FontSize=12Dorecordnum=InputBox("请输入要查找的记录号(输入0结束):")Ifrecordnum>0Andrecordnum<=recordnumberThenGet#1,recordnum,recordvarPrintrecordvar.EmName;"";recordvar.Unit;"";Printrecordvar.Age;"";recordvar.Salary;"";Loc(1)MsgBox"单击'确定'按钮继续"ElseIfrecordnum>recordnumberThenMsgBox"输入超出范围,请重新输入"EndIfLoopUntilrecordnum=0EndSub说明键盘输入记录号放入变量recordnum中,按此记录号用Get从文件中读输入0时结束随机读取PrivateSubForm_Click()Open"c:\temp\employee.dat"ForRandomAs#1Len=Len(recordvar)recordnumber=LOF(1)/Len(recordvar)Newline=Chr$(13)+Chr$(10)msg$=“1.添加记录"msg$=msg$+Newline+"2.顺序方式读记录"msg$=msg$+Newline+"3.通过记录号读文件"msg$=msg$+Newline+"4.删除记录"msg$=msg$+Newline+"0.退出程序"msg$=msg$+Newline+Newline+"请输入数字选择:"Doresp=InputBox(msg$)SelectCaserespCase0Close#1:EndCase1File_WriteCase2File_read1:MsgBox"单击'确定'按钮继续"Case3File_read2Case4p=InputBox("输入记录号:"):Deleterec(p)EndSelectLoopEndSub利用窗体事件过程选择要进行的操作【例14.9】——窗体事件过程14.5.2随机文件中记录的增加与删除

在【例14.9】中增加记录实际就是在文件的末尾追加记录,方法是,先找到文件最后一个记录的记录号,然后把要增加的记录写到它的后面通用过程File_Write具有增加记录的功能,因此不必再添加新的代码说明利用“文件长度/记录长度”的方法计算一共有几条记录键盘输入操作种类的代号,放入变量resp中,根据resp中的值决定调用哪个过程,进行何种操作由于输入“0”则结束程序运行(End语句),所以使用了死循环【例14.9】——删除记录(一)思路在随机文件中删除一个记录时,并不是真正删除记录,而是用后面一个记录覆盖要删除的记录,而且再后面的所有记录也依次前移,同时令表示记录个数的变量recordnumber的值减一在后面的操作中只对剩下的recordnumber个记录进行操作特点处理比较简单没有改变磁盘文件的长度和记录个数,有可能造成以后操作的错误【例14.9】——删除记录(二)用一个通用过程实现指定记录的删除操作SubDeleterec(positionAsInteger)Ifposition>0ThenDoGet#1,position+1,recordvarIfLoc(1)>recordnumberThenExitDoPut#1,position,recordvarposition=position+1Looprecordnumber=recordnumber-1EndIfEndSub说明参数position是要删除的记录号,在删除记录时输入利用Loc函数返回读到记录的前一个记录号,并用此决定是否结束循环如果要删除的记录号position超过了最大记录号recordnumber,则实际删除的是最后一条记录【例14.9】——删除记录(三)Deleterec过程也可用下面方法编写SubDeleterec(positionAsInteger)Ifposition>0ThenDoWhileposition<recordnumberGet#1,position+1,recordvarPut#1,position,recordvarposition=position+1Looprecordnumber=recordnumber-1EndIfEndSub说明本过程用position来控制循环,更便于理解【例14.9】——删除记录(四)删除记录算法的讨论缺点磁盘上文件的记录总数未变,最后2条(或多条)记录是相同的,只是在显示时,只显示前recordnumber条记录由于实际文件的长度未变,在下次单击窗体,执行Form_Click过程重新统计文件记录个数(recordnumber=LOF(1)/Len(recordvar)语句)时,将会产生错误解决的方法在用上述方法删除一条记录后,把剩下的recordnumber个记录存入另一个随机文件中,然后删除正在操作的随机文件,再把那另一个随机文件的文件名改为被删除的那个文件的文件名14.6文件系统控件

在Windows应用程序中,通常利用一个对话框来选择要操作的磁盘文件,在这个对话框中,可以指定文件、目录及驱动器名,方便地查看系统的磁盘、目录及文件等信息为建立这样的对话框,VisualBasic提供了三个控件,用以编写文件管理程序驱动器列表框(DriveListBox)目录列表框(DirectoryListbox)文件列表框(FileListbox)14.6.1驱动器列表框和目录列表框驱动器列表框和目录列表框是下拉式列表框,在工具箱中的图标如图所示驱动器列表框驱动器列表框的Drive属性Drive属性的值是字符型,表示当前驱动器Drive属性不能通过属性窗口设置,只能在程序中赋值一个驱动器名如果不赋值,则Drive属性是运行程序时的当前驱动器如果赋值则改变当前驱动器例如:驱动器列表框名.Drive=“D:”,把当前驱动器改为D盘每次重新设置Drive属性时,将引发驱动器列表框的Change事件在程序执行期间,单击列表框右端向下的箭头,则把计算机所有驱动器名称全部下拉显示出来,如图所示。单击某个驱动器名,即可把它变为当前驱动器选择一个驱动器后,Drive属性自动被赋值为该驱动器名目录列表框

目录列表框用来显示当前驱动器上的目录结构目录列表框如图所示目录列表框中只显示当前驱动器上的目录。如果要显示其他驱动器上的目录,必须改变路径,需要重新设置其Path属性目录列表框的Path属性Path属性用来设置或返回当前驱动器的路径,其格式为:目录列表框.Path[="路径"]“路径”的格式与DOS下的路径格式相同Path属性不能通过属性窗口设置,只能在程序中赋值例如:目录列表框名.Path="c:\msoffice"在目录列表框中选中某个文件夹时会自动改变Path属性当改变Path属性值时,将引发目录列表框的Change事件驱动器列表框与目录列表框的同步

驱动器列表框与目录列表框有着密切关系在一般情况下,改变驱动器列表框中的驱动器名后,目录列表框中的目录应当随之变为该驱动器上的目录,即应该使驱动器列表框和目录列表框产生同步效果。这可以利用驱动器列表框的Change事件来实现例如(驱动器列表框名为Drive1,目录列表框名为Dir1)PrivateSubDrive1_Cahnge()Dir1.Path=Drive1.DriveEndSub当驱动器列表框Drive属性值改变时,将产生Change事件并调用上述过程,从而同步改变了目录列表框的Path属性文件列表框(一)

文件列表框可以用来显示当前目录下的文件工具箱中,文件列表框的图标是文件列表框属性Pattern属性用来设置在执行时要显示的文件类型例如:file1.Pattern=“*.md

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论