第九章文件[学习目标]掌握:文件控件和文件操作理解:文件类型及结构[学习要点]文件处理函数利用文件控件处理文件的方法。文件是存储在外部介质(如磁盘)上的以文件名标识的数据的集合。通常由一组存放在磁盘上的相关字节组成。当应用程序要访问文件时,必须自己决定文件中字节的意义(比如,表示字符、数据记录、整数、字符串等等)。9.1文件处理语句和函数VisualBasic提供了对文件的读写访问能力。为能有效地存取数据,访问文件时,应根据文件中存储的数据的不同数据类型,采用不同的方法进行访问。在VisualBasic中,有3种文件访问类型:顺序型:用于读写连续的文本文件。随机型:用于读写有固定长度记录结构的文本文件或者二进制文件。二进制型:用于读写任意结构的文件。9.1文件处理语句和函数在VB中,根据文件的结构和访问方式,文件分成:顺序文件随机文件二进制文件文件在存储介质上的位置是依赖于驱动器名、文件夹(目录)和文件名来定位的。为访问存放在外部介质上的数据,应先按文件名找到所指定的文件,然后再从该文件中读取数据。9.1文件处理语句和函数虽然这3种文件访问的数据类型不同,但应用程序访问它们的步骤却相似:①使用Open语句打开文件,并为文件指定一个文件号。对文件进行任何I/O操作之前,都必须经过这步操作。②从文件中读取部分或全部数据到变量中。③对变量中的数据进行处理。④将处理后的数据保存回文件中。⑤使用Close语句关闭文件。如果没有关闭文件,则会导致文件中部分或全部信息丢失。9.1文件处理语句和函数顺序文件是一种适用于在连续块中读写的文本文件。这种文件中的数据由文本字符组成。这些字符既可以是ASCII码字符集中的可显示字符,也可以是汉字字符。顺序文件按行组织,每一行的结尾由“回车”和“换行”字符指示。在顺序文件中,只知道第一个记录的存放位置,其他的记录无从知晓。当要查找某项数据时,只能从文件的开头,一个记录一个记录的顺序查找,直到找到所需记录为止。“回车”字符的ASCII码为13,“换行”字符的ASCII码为10。当用户要处理只包含文本的文件时,比如由文本编辑器创建的文件,最好使用顺序型访问。9.2顺序文件一、打开顺序文件Open“文件名”[For模式]As[#]文件号[Len=记录长度]其中:(1)模式OUTPUT:写操作INPUT:读操作APPEND:追加到文件未尾(2)文件号1~511,可以用FreeFile函数获得下一个可利用的文件号。(3)记录长度小于或等于32767的整数,它指定数据缓冲区的大小。例如:打开C:\VB\SCORE,供写入数据,指定文件号为#1。OPENC:\VB\SCOREFOROUTPUTAS#19.2顺序文件二、读顺序文件1.Input#语句格式:Input#文件号,变量列表功能:从已打开的顺序文件中读出数据,并将数据指定给用逗号分界的变量列表中的变量。2.LineInput#语句格式:LineInput#文件号,字符串变量功能:从已打开的顺序文件中读出一行并将它分配给字符串变量。3.Input()函数格式:INPUT(读取字符数,#文件号)功能:读取以Input或Binary方式打开的文件中的指定数目的字符。9.2顺序文件例题:读文本文件到文本框假定文本框名称为txtTest,文件名为MYFILE.TXT。常用的函数:LOF(文件号):返回文件的长度(总字节数)。EOF(文件号):返回读写位置。文件未到结尾时,EOF函数为False,否则为True解法:方法1:一行一行读txtTest.Text=OpenMYFILE.TXTForInputAs#1DoWhileNotEOF(1)LineInput#1,InputDatatxtTest.Text=txtTest.Text+InputData+char(13)+char(10)LoopClose#19.2顺序文件方法2:一次性读txtTest.Text=OpenMYFILE.TXTForInputAs#1txtTest.Text=Input(LOF(1),#1)Close#1方法3:一个个字符读DimInputDataasString*1txtTest.Text=OpenMYFILE.TXTForInputAs#1DoWhileNotEOF(1)InputData=Input(1,#1)txtTest.Text=txtTest.Text+InputDataLoopClose#19.2顺序文件三、写顺序文件要在顺序文件中写入变量的内容时,应以Output或Append方式打开它。当以Output模式打开文件时,如果文件已存在,则文件中原来的内容会被覆盖;若文件不存在,则会建立一个新文件,将数据从头开始写入。当文件以Append模式打开时,如果文件已经存在,则在写入数据时不会将原来的数据覆盖,而是从文件末尾开始,将新数据添加到文件中。在将数据写入文件时,应根据是否要覆盖原文件来选择不同的文件打开模式。9.2顺序文件1.写入命令格式:Print#文件号,[输出列表]功能:将格式化显示的数据写入顺序文件中。2.Write#语句格式:Write#文件号,[输出列表]功能:将数据写入顺序文件。例如:命令:Write#1,One,Two,123内容:One,Two,123注意:与Print#语句不同,当要将数据写入文件时,Write#语句采用紧凑格式,即数据项之间插入“,”,没有必要在列表中键入明确的分界符。Write#语句在将outputlist中的最后一个字符写入文件后会插入一个新行字符,即回车换行符。9.2顺序文件例题:将文本框的内容写到文本文件中假定文本框的名称为txtTest,文件名为TEST.DAT。方法1:把整个文本框的内容一次性地写入文件。OpenTEST.DATForOutputAs#1Print#1,txtTest.TextClose#1方法2:把整个文本框的内容一个字符一个字符地写入文件。OpenTEST.DATForOutputAs#1Fori=1Tolen(txtTest.Text)Print#1,Mid(txtTest.Text,i,1);NextiClose#19.2顺序文件四、关闭顺序文件格式:Close[[#]文件号][,[#]文件号]...功能:语句用于关闭使用Open语句所打开的输入/输出文件。例如:Close#1,#2,#3注意:若省略Close关键字后的内容,则将关闭Open语句打开的所有活动文件。即使没有Close语句,当程序结束时,也将自动关闭所有打开的文件。但是Close语句还是必要的,如果不使用Close语句,可能会使得某些需要写入的数据不能从内存写入文件中。当打开的文件或设备正在输出时,执行Close语句并不会使输出信息的操作中断。9.2顺序文件例9.1顺序文件的使用示例本程序演示顺序文件的读写操作,程序运行示意如图9.1所示。该程序可以打开一个顺序文件,将其内容存入文本框中进行修改,并可以保存修改。改成可以将文本框的内容在磁盘上建立一个顺序文件。9.2顺序文件9.2顺序文件设置控件事件代码如下:PrivateSubCommand1_Click()本过程完成文件的读取功能DimFile1AsstringDimnextlineAsStringCommonDialog1.Filter=TextFiles(.txt)|.txt指定默认文件类型CommonDialog1.ShowOpen调用以CommonDialog1控件打开的对话框,以输入要打开的文件名File1=CommonDialog1.filename将打开对话框提供的文件名赋予变量File19.2顺序文件OpenFile1ForInputAs#1按读方式打开下面循环可以用语句“Text1.text=Input(LOF(1),1)”替代DoUntilEOF(1)将打开文本文件的内容赋予文本框LineInput#1,nextlineText1.Text=Text1.Text+nextline+Chr(13)+Chr(10)LoopClose1关闭打开的文件EndSub9.2顺序文件PrivateSubCommand2_Click()本过程完成将文本框的内容写入文件中Dimcontents,File1CommonDialog1.showSave调用CommandDialog1控件的保存对话框,以提供建立文件的文件名File1=CommonDialog1.filenameOpenFile1ForOutputAs#1以写方式打文件Contents=Text1.TextText1.Text=清除文本框中的内容Print#1,Contents往文件中写入内容Close1EndSubPrivateSubCommand3_Click()UnloadMe退出程序EndSub9.2顺序文件9.3随机文件在文件中以顺序文件方式进行存取数据很方便也很常用,但是当需要大量查找或修改文件中的数据时会很困难,而这时采用随机文件方式存取数据就显得比较方便。随机文件的每一个数据项都有相同的长度,它的数据项通常称做记录。随机文件是以记录为单位的,每条记录都被赋予了记录号以便查找。应用程序可以根据记录号直接读取随机文件中的任意记录,而无须由前至后逐个读取记录。对随机文件的存取是以记录为单位进行的,每个记录包括一个或多个字段。具有一个字段的记录对应于任一标准类型,比如整数或定长字符串。具有多个字段的记录对应于用户自定义类型。9.3.1声明记录类型变量在打开一个文件进行随机访问之前,应定义一个类型,该类型对应于该文件包含或将包含的记录。语法格式为:[Private|Public]Type自定义类型名元素名Astype[元素名Astype]…EndType9.3随机文件例如,声明一个学生自定义类型。TypeStudentNumberAsString2学号,宽度为2字节NameAsString8姓名,宽度为8字节ScoreAsInteger成绩,宽度为2字节EndType9.3随机文件在定义与记录对应的类型以后,应接着声明程序需要的任何其他变量,用来处理作为随机访问而打开的文件。如:Publicstudent1,student2Asstudent定义记录变量PublicstnumeAsInteger定义存放当前记录号的变量PublicLastRecordAsLong存放最后一条记录的编号9.3随机文件例如:DimLastrecordAsLong存放最后一个记录的编号Dimstudent1AsstudentDimRecLengthasLongRecLength=Len(student1)计算每条记录的长度FileNum=FreeFile()取出下一个可用文件编号OpenSchool.datForRandomAsFileNum用Open语句打开新文件LastRecord=LOF(FileNum)/RecLength存放文件中记录的个数9.3随机文件9.3.2随机文件的操作一、打开格式:Open文件名ForRandomAs#文件号[Len=记录长度]二、读操作1.格式:Get[#]文件号,[记录号],变量名2.功能:将一个已打开的磁盘文件的一条记录的内容读入一个变量之中。忽略记录号,则读出当前记录后的那一条记录。9.3随机文件下面的例子使用Get语句来将数据从文件读到变量中DimStudent1AsStudent,PositionAsLong声明变量OpenSchool.datForRandomAs#1为随机访问打开样本文件Position=4定义记录号Get#1,Position,Student1读第4个记录到变量Student1中Close#1关闭文件9.3随机文件三、写操作1.格式:Put[#]文件号,[记录号],变量