第7章 数据操作(1).ppt
第第7章章 数据文件操作数据文件操作重要知识点:重要知识点:数据流和数据文件概念数据流和数据文件概念顺序文件顺序文件随机文件随机文件学习内容学习内容数据流和数据文件概念数据流和数据文件概念顺序文件顺序文件随机文件随机文件二进制文件(自学)二进制文件(自学)数据文件数据文件是数据的集合,一般保存在磁盘等外部存是数据的集合,一般保存在磁盘等外部存储器中,简称储器中,简称文件文件。开发应用程序中,少量变化不大的数据存开发应用程序中,少量变化不大的数据存放在变量、数组等结构中;数据量大的要放在变量、数组等结构中;数据量大的要以文件形式保存。以文件形式保存。数据文件孤立地看就是数据文件孤立地看就是二进制比特流二进制比特流,其,其结构保存在应用程序中。结构保存在应用程序中。在在VB.NET中有中有顺序文件顺序文件、随机文件随机文件和和二进二进制文件制文件三种类型。三种类型。数据流数据流如果抽去数据文件的逻辑含义,可以将文件如果抽去数据文件的逻辑含义,可以将文件看成由若干字节组成的序列,这个字节序列看成由若干字节组成的序列,这个字节序列被称为被称为数据流数据流,简称,简称流流。向文件中写入数据称为向文件中写入数据称为输入流输入流。从文件中读取数据称为从文件中读取数据称为输出流输出流。常用文件操作函数常用文件操作函数MkDir()功能和格式:创建文件夹。功能和格式:创建文件夹。MkDir(路径路径)例如:例如:MkDir(“C:NewFold)RmDir()功能和格式:删除文件夹。功能和格式:删除文件夹。RmDir(路径路径)例如:例如:RmDir(C:NewFold)Dir()功能和格式:显示文件目录。功能和格式:显示文件目录。Dir(路径路径,属性属性)例如:例如:Dir(C:AUTOEXEC.BAT)常用文件操作函数常用文件操作函数ChDrive()功能和格式:更改当前磁盘驱动器。功能和格式:更改当前磁盘驱动器。ChDrive(驱动器驱动器名名)例如:例如:ChDrive(“D:)ChDir()功能和格式:更改当前文件夹。功能和格式:更改当前文件夹。ChDir(新路径新路径)例如:例如:ChDir(C:NewFold)CurDir()功能和格式:返回当前路径。功能和格式:返回当前路径。CurDir(驱动器名驱动器名)例如:例如:CurDir(C:)常用文件操作函数常用文件操作函数FileCopy()功能:复制文件。功能:复制文件。格式:格式:FileCopy(源路径与源文件名,目的路径与目的文源路径与源文件名,目的路径与目的文件名件名)例如:例如:FileCopy(D:工作小结工作小结.doc,C:报告报告.doc)Kill()功能和格式:删除文件。功能和格式:删除文件。Kill(路径名路径名+文件名文件名)例如:例如:Kill(“D:temp.doc)Rename()功能和格式:文件改名。功能和格式:文件改名。Rename(路径路径+旧文件名,路径旧文件名,路径+新文件名新文件名)例如:例如:Rename(D:工作小结工作小结.doc,“D:报告报告.doc)顺序文件顺序文件l实质是文本文件,数据按输入的顺序依次排列。实质是文本文件,数据按输入的顺序依次排列。l顺序文件的特点:顺序文件的特点:数据流中各数据的类型可以不同数据流中各数据的类型可以不同对文件查询访问总是要从第对文件查询访问总是要从第1 1个数据开始个数据开始新数据总是被追加到文件尾新数据总是被追加到文件尾不能跳跃访问不能跳跃访问l访问顺序文件的方法:访问顺序文件的方法:System.IO.StreamWriter类类System.IO.StreamReader类类顺序文件创建和写入数据步骤顺序文件创建和写入数据步骤1.创建用于写入数据的数据文件。格式为:创建用于写入数据的数据文件。格式为:Dim 对象名对象名 As New System.IO.StreamWriter(路径路径+文件名文件名)注:注:如果文件已经存在,则覆盖该文件。如果文件已经存在,则覆盖该文件。2.往文件中写入数据。有两种方法:往文件中写入数据。有两种方法:StreamWriter对象名对象名.Write(需写入的数据需写入的数据)StreamWriter对象名对象名.WriteLine(需写入的数据需写入的数据)3.关闭文件。格式为:关闭文件。格式为:StreamWriter对象名对象名.Close()【例例1】创建如下程序,运行后在文本框中分别输入创建如下程序,运行后在文本框中分别输入“李华李华”、“67”,单击,单击“输入数据输入数据”按钮,则按钮,则在在C盘根目录下生成一个盘根目录下生成一个“心率心率.txt”的文件。的文件。“输入数据输入数据”的的Click事件过程代码:事件过程代码:Dim FileWriter As New System.IO.StreamWriter(“c:心率心率.txt)FileWriter.WriteLine(TextBox1.Text)FileWriter.WriteLine(TextBox2.Text)FileWriter.Close()创建创建StreamWriter对象对象向文件中写入数据向文件中写入数据关闭文件关闭文件顺序文件读取数据步骤顺序文件读取数据步骤1.创建一个创建一个StreamReader对象。格式为:对象。格式为:Dim 对象名对象名 As New System.IO.StreamReader(路径路径+文件名文件名)2.从文件中读取数据。有两种方法:从文件中读取数据。有两种方法:StreamReader对象名对象名.Read()StreamReader对象名对象名.ReadLine()注:顺序文件打开后,总是从第注:顺序文件打开后,总是从第1个数据开始读取,下一次个数据开始读取,下一次读取的则是第读取的则是第2个数据,依次类推。个数据,依次类推。3.关闭文件。格式为:关闭文件。格式为:StreamReader对象名对象名.Close()【例例2】在例在例1中增加一个按钮,读取中增加一个按钮,读取“心率心率.txt”顺顺序文件中的数据。序文件中的数据。“读取数据读取数据”的的Click事件过程代码:事件过程代码:Dim FileReader As New System.IO.StreamReader(“c:心率心率.txt)Dim Data As StringData=FileReader.ReadLineTextBox1.Text=DataData=FileReader.ReadLineTextBox2.Text=DataFileReader.Close()创建创建StreamReader对象对象从文件中读取数据,从文件中读取数据,并显示在文本框中并显示在文本框中关闭文件关闭文件顺序文件追加数据步骤顺序文件追加数据步骤1.创建用于追加数据的创建用于追加数据的StreamWriter对象。格式为:对象。格式为:Dim 对象名对象名 As New System.IO.StreamWriter(路径路径+文件文件名名,System.IO.FileMode.Append)2.往文件中写入数据。有两种方法:往文件中写入数据。有两种方法:StreamWriter对象名称对象名称.Write(需追加的数据需追加的数据)StreamWriter对象名称对象名称.WriteLine(需追加的数据需追加的数据)3.关闭文件。格式为:关闭文件。格式为:StreamWriter对象名称对象名称.Close()注意:顺序文件会把数据追加到文件末尾!注意:顺序文件会把数据追加到文件末尾!【例例3】在例在例2中再增加一个按钮,给中再增加一个按钮,给“心率心率.txt”顺顺序文件追加两组数据。序文件追加两组数据。“追加数据追加数据”的的Click事件过程代码:事件过程代码:Dim FileWriter As New System.IO.StreamWriter(“c:心率心率.txt,System.IO.FileMode.Append)FileWriter.WriteLine(TextBox1.Text)FileWriter.WriteLine(TextBox2.Text)FileWriter.Close()创建可追加的创建可追加的StreamWriter对象对象向文件中追加数据向文件中追加数据关闭文件关闭文件顺序文件读取多组数据顺序文件读取多组数据注意:如果数据读取完后还继续读取,则读取到的值为注意:如果数据读取完后还继续读取,则读取到的值为Nothing。【例例4】在例在例3中增加相应控件,计算中增加相应控件,计算“心率心率.txt”中中存储的所有人的心率的平均值。存储的所有人的心率的平均值。“平均值平均值”的的Click事件过程代码:事件过程代码:Dim FileReader As New System.IO.StreamReader(“c:心率心率.txt)Dim str_name As StringDim data As IntegerDim sum As Integer,avg As SingleDim n As Integerstr_name=FileReader.ReadLineDo While str_name Nothingdata=FileReader.ReadLinesum=sum+datan=n+1str_name=FileReader.ReadLineLoopavg=sum/nTextBox3.Text=avgFileReader.Close()读取第一个姓名数据读取第一个姓名数据当文件中还有数据时当文件中还有数据时读取其对应的心率数据读取其对应的心率数据求和求和计数,一共有多少组数据计数,一共有多少组数据读取下一个姓名数据读取下一个姓名数据顺序文件删除数据步骤顺序文件删除数据步骤1.创建一个创建一个StreamReader对象,读取原文件中的数据。对象,读取原文件中的数据。2.创建一个创建一个StreamWriter对象,新建一个临时文件。对象,新建一个临时文件。3.将要保留的数据依次从原文件中读取出来,并写入临将要保留的数据依次从原文件中读取出来,并写入临时文件中。时文件中。4.关闭原文件和临时文件。关闭原文件和临时文件。5.利用利用Kill()函数删除原文件。函数删除原文件。6.利用利用Rename()函数将临时文件改为原文件的名字和函数将临时文件改为原文件的名字和路径。路径。【例例5】在例在例4中再增加一个按钮,将中再增加一个按钮,将“心率心率.txt”文文件中件中“王小光王小光”及心率删除。及心率删除。“删除数据删除数据”的的Click事件过程代码:事件过程代码:Dim FileWriter As New System.IO.StreamWriter(“c:temp.txt)Dim FileReader As New System.IO.StreamReader(“c:心率心率.txt)Dim str_name As String,data As Integerstr_name=FileReader.ReadLinedata=FileReader.ReadLineDo While str_name NothingIf str_name 王小光王小光 ThenFileWriter.WriteLine(str_name)FileWriter.WriteLine(data)End Ifstr_name=FileReader.ReadLinedata=FileReader.ReadLineLoopFileWriter.Close()FileReader.Close()Kill(“c:心率心率.txt)Rename(“c:temp.txt,“c:心率心率.txt)创建临时文件创建临时文件当文件中还有数据时当文件中还有数据时如果不是王小光的数据,如果不是王小光的数据,则写入临时文件中则写入临时文件中准备读取数据准备读取数据读取第一个姓名读取第一个姓名读取第一个心率读取第一个心率读取下一个姓名和心率读取下一个姓名和心率关闭两个文件关闭两个文件删除原文件删除原文件将临时文件改为原文件的路径和名称将临时文件改为原文件的路径和名称顺序文件插入数据步骤顺序文件插入数据步骤1.创建一个创建一个StreamReader对象,读取原文件中的数据。对象,读取原文件中的数据。2.创建一个创建一个StreamWriter对象,新建一个临时文件。对象,新建一个临时文件。3.将插入位置之前的数据依次从原文件中读取出来,并将插入位置之前的数据依次从原文件中读取出来,并写入临时文件中。写入临时文件中。4.将要插入的数据写入临时文件中。将要插入的数据写入临时文件中。5.将插入位置之后的数据依次从原文件中读取出来,并将插入位置之后的数据依次从原文件中读取出来,并写入临时文件中。写入临时文件中。6.关闭原文件和临时文件。关闭原文件和临时文件。7.利用利用Kill()函数删除原文件。函数删除原文件。8.利用利用Rename()函数将临时文件改为原文件的名字和函数将临时文件改为原文件的名字和路径。路径。请在课后实训请在课后实训1的拓展要求的拓展要求中实践这一过程。中实践这一过程。作业作业实训实训1随机文件随机文件l数据逻辑排列类似于数据逻辑排列类似于二维表二维表。l文件由文件由等长记录等长记录组成。组成。l可可自由定位自由定位,不一定总要从第,不一定总要从第1 1个数据开始个数据开始编号姓名性别住院日期花费金额001李显男2011-09-05780002王小光男2011-09-06920003马一鸣女2012-03-05800随机文件的记录随机文件的记录l记录由记录由字段字段组成,同一记录中各字段的类型长度可组成,同一记录中各字段的类型长度可不同,但不同记录相同字段的类型长度必须一致。不同,但不同记录相同字段的类型长度必须一致。l程序中需要使用程序中需要使用结构类型结构类型(即用户自定义类型,相(即用户自定义类型,相关内容请参看教材关内容请参看教材p30p30的的2.1.22.1.2节)来读写数据。节)来读写数据。l记录的长度记录的长度就是组成记录的各字段长度之和。就是组成记录的各字段长度之和。编号姓名性别住院日期花费金额001李显男2011-09-05780002王小光男2011-09-06920003马一鸣女2012-03-05800【例例6】用户自定义数据类型声明示例。新建一个项用户自定义数据类型声明示例。新建一个项目,按照目,按照“住院病人表住院病人表”声明一个名为声明一个名为Patient的的结构类型。结构类型。在模块的在模块的“声明声明”段写入代码:段写入代码:Structure Patient Public Code As String Public Name As String Public Sex As Boolean Public p_Date As Date Public Spend As SingleEnd Structure注意字符串的声明方式注意字符串的声明方式注:该结构类型的长度为注:该结构类型的长度为3+6+2+8+4=23(B)创建和打开随机文件创建和打开随机文件语法格式语法格式:FileOpen(文件号,路径+文件名,OpenMode.打开模式,读写方式,共享方式,记录长度)文件号:一个整型数,代表被打开的文件打开模式:Append、Binary、Input、Output和Random。随机文件使用OpenMode.Random模式读写模式:Read、Write和ReadWrite(可读可写,默认)共享方式:Shared、LockRead、LockWrite、LockReadWrite(读写锁定,默认)记录长度:指定构成记录的字节数(32767字节)如果打开的文件不存在,则创建该文件如果打开的文件不存在,则创建该文件。记录的读写记录的读写写入记录格式:写入记录格式:FilePut(文件号,记录值,记录号)文件号:代表已打开的随机文件记录值:一个结构型变量名记录号:记录号从1开始,如果省略记录号,表示写入上次操作记录的下一个记录例如:向1号文件的第100条记录写入变量stud的内容 FilePut(1,stud,100)FileGet(文件号,结构型变量,记录号)读取记录格式:读取记录格式:常用文件操作函数常用文件操作函数EOF(文件号文件号):判断随机文件中记录是否已读完。读完最:判断随机文件中记录是否已读完。读完最 后一条记录,后一条记录,EOF()的值变为的值变为True。LOF(文件号文件号):返回被打开文件的长度,单位是字节。:返回被打开文件的长度,单位是字节。LOC(文件号文件号):返回被打开文件的读写位置。:返回被打开文件的读写位置。n随机文件中,返回上次读取随机文件中,返回上次读取/写入记录的记录号。写入记录的记录号。n二进制文件中,返回上次读取二进制文件中,返回上次读取/写入的最后字节的位置写入的最后字节的位置 FileClose(文件号文件号):将内存缓冲区中的数据全部写入文件:将内存缓冲区中的数据全部写入文件号指定的文件中,然后关闭文件。如果没有指定文件号,则号指定的文件中,然后关闭文件。如果没有指定文件号,则所有处于打开状态的活动文件全部关闭所有处于打开状态的活动文件全部关闭。【例例7】在例在例6的基础上,以随机文件的方式完成如的基础上,以随机文件的方式完成如下图所示的程序。下图所示的程序。“打开文件打开文件”的的Click事件过程代码:事件过程代码:FileOpen(1,d:patient.txt,OpenMode.Random,23)Button1.Enabled=False随机方式打开文件随机方式打开文件文件打开后,该按钮即不可用文件打开后,该按钮即不可用“写入文件写入文件”的的Click事件过程代码:事件过程代码:Dim pa As Patientpa.Code=TextBox1.Textpa.Name=TextBox2.Textpa.p_Date=TextBox3.Textpa.Spend=TextBox4.Textpa.Sex=RadioButton1.CheckedFilePut(1,pa)TextBox1.Text=TextBox2.Text=TextBox3.Text=TextBox4.Text=RadioButton1.Checked=True声明声明pa为为Patient类型类型清空窗口上的数据清空窗口上的数据将数据写人文件中将数据写人文件中给给pa中的各变量赋值中的各变量赋值“关闭退出关闭退出”的的Click事件过程代码:事件过程代码:FileClose()End关闭文件关闭文件结束程序结束程序【例例8】在例在例7的基础上增加一个的基础上增加一个“读取记录读取记录”的按的按钮,打开文件后,单击一次钮,打开文件后,单击一次“读取数据读取数据”按钮则按钮则读取一条记录,直到全部读取完毕。读取一条记录,直到全部读取完毕。“读取记录读取记录”的的Click事件过程代码:事件过程代码:Dim pa_read As PatientStatic recorder As IntegerIf EOF(1)ThenMsgBox(读取完毕!读取完毕!)Exit SubEnd Ifrecorder=recorder+1FileGet(1,pa_read,recorder)TextBox1.Text=pa_read.CodeTextBox2.Text=pa_read.NameTextBox3.Text=pa_read.p_DateTextBox4.Text=pa_read.Spend If pa_read.Sex=True Then RadioButton1.Checked=True Else RadioButton2.Checked=True End If定义静态变量存放记录号定义静态变量存放记录号如果读取完毕,则给出提示并退出如果读取完毕,则给出提示并退出记录号每次加记录号每次加1读取对应记录号的记录读取对应记录号的记录【例例9】在例在例8的基础上增加一个的基础上增加一个“插入记录插入记录”的按的按钮,打开文件后,单击钮,打开文件后,单击“插入记录插入记录”按钮则在编按钮则在编号是号是“003”的记录前插入一条新记录。的记录前插入一条新记录。“插入记录插入记录”的的Click事件过程代码:事件过程代码:Dim pa_insert As PatientDim insert,last As IntegerDim i As Integeri=1Do While Not EOF(1)FileGet(1,pa_insert,i)If pa_insert.Code=003 Theninsert=iEnd Ifi=i+1Looplast=i-1得到得到“003”记录的记录号记录的记录号得到最后一条记录的记录号得到最后一条记录的记录号“插入记录插入记录”的的Click事件过程代码事件过程代码(续续):For i=last To insert Step-1FileGet(1,pa_insert,i)FilePut(1,pa_insert,i+1)Nextpa_insert.Code=TextBox1.Textpa_insert.Name=TextBox2.Textpa_insert.p_Date=TextBox3.Textpa_insert.Spend=TextBox4.Textpa_insert.Sex=RadioButton1.CheckedFilePut(1,pa_insert,insert)TextBox1.Text=TextBox2.Text=TextBox3.Text=TextBox4.Text=RadioButton1.Checked=True将将“003”记录以后的记录下移一个记录以后的记录下移一个将新记录写入到原来将新记录写入到原来“003”的记录位置的记录位置练习和作业练习和作业练习练习1:请试着完成随机文件记录的删除操:请试着完成随机文件记录的删除操作(参看教材作(参看教材P213的例的例7.11)练习练习2:教材:教材p216的通讯录管理程序的通讯录管理程序作业:实训作业:实训3