410 likes | 545 Views
《Visual Basic 程序设计 》. 第七章 文件操作. 主讲:赵娜 计算机系信息教研室. 本章主要任务: 1. 掌握文件系统的基本概念; 2. 掌握顺序文件、随机文件的特点和使用; 3. 掌握对在应用程序中不同类型文件的打开、关闭和读写操作。. 文件 是存储在外部介质上的以文件名为标识的 数据的集合 。 在Visual Basic中,文件说明的一般格式 设备名: 文件引用名 文件引用名由文件基本名和扩展名组成. 7.1 文件概念. 文件的结构 文件 记录 字段 字符. 表 7-1 居民区人员登记表( jmdjb.dat ).
E N D
《Visual Basic程序设计》 第七章 文件操作 主讲:赵娜 计算机系信息教研室
本章主要任务: 1.掌握文件系统的基本概念; 2.掌握顺序文件、随机文件的特点和使用; 3.掌握对在应用程序中不同类型文件的打开、关闭和读写操作。
文件是存储在外部介质上的以文件名为标识的数据的集合。文件是存储在外部介质上的以文件名为标识的数据的集合。 在Visual Basic中,文件说明的一般格式 设备名:\文件引用名 文件引用名由文件基本名和扩展名组成 7.1 文件概念
文件的结构 文件 记录 字段 字符 表7-1 居民区人员登记表(jmdjb.dat)
根据文件中存储信息所使用的编码方式,可以将文件分为二进制文件和ASCII文件。 根据文件的性质,可以把文件分为程序文件和数据文件两大类。
1.顺序文件(Sequential File) 结构比较简单,文件中的数据是按顺序组织的文本行,每行即为一个数据记录,每行长度可以变化,行之间以换行符作为分隔符。 2.随机文件(Random Access File) 由一组长度完全相同的记录组成。记录与记录之间不需要分隔符号。一般以二进制形式存放,每个记录包含一个或多个字段。可以按任意次序读写。 3.二进制文件(Binary file) 最原始的文件类型,它直接把二进制码存放在文件中,没有固定的格式。二进制访问模式以字节数来定位数据,允许在程序中按任何方式组织和访问数据,占用空间较小,存取灵活。 按照文件的存取方式和组成,把文件分为以下三类:
6.2.1顺序文件的打开与关闭 1. 打开顺序文件 在对文件进行任何操作之前,必须先打开文件,同时通知操作系统对文件进行读操作还是写操作。 Open 文件名For 打开方式As # <文件号>[Len=缓冲区大小] 文件名可以是字符串常量,也可以是字符串变量。 “打开方式”为下列三种形式之一: Output:对文件进行写操作。 Input:对文件进行读操作。 Append:对文件末尾追加记录,使原有内容不被擦除,新记录加在其后。 6.2 顺序文件
注意:使用Output方式打开一个存在的文件,将会创建一个新的顺序文件,磁盘上原有的同名文件将会被覆盖,其中的数据将全部丢失。注意:使用Output方式打开一个存在的文件,将会创建一个新的顺序文件,磁盘上原有的同名文件将会被覆盖,其中的数据将全部丢失。 (2)文件号是一个介于1~511之间的整数。当打开一个文件并为它指定一个文件号后,该文件号就代表文件,直到文件被关闭后,此文件号可以再被其它文件使用。 在复杂的应用程序中,可以利用FreeFile函数获得可利用的文件号。
关闭文件所用的语句是Close。 格式:Close [[#]文件号][,[#]文件号] 例如,Close #1,#2,#3 是关闭1号,2号和3号文件的命令。如果省略了文件号,Close命令将会关闭所有已经打开的文件。 2. 关闭顺序文件
(1)Print # 语句 格式:Print # <文件号>[,<输出列表>] 用于将格式化显示的数据写入顺序文件中。 (2) Write # 语句 格式:Write #<文件号>[,<输出列表>] 用于将划分了字段的记录格式的数据写入文件 。 6.2.2顺序文件的读写操作1.写操作
Open "E:\VB\Exercise.TXT" For Output As #1 ‘打开文件以便输出 Print #1,”顺序文件写入数据测试” ‘向文件中写入字符串”This is a test” Print #1, ‘输出一个空行 Print #1,”Zone 1”;Tab;”Zone 2” ‘在两个打印区输出 Print #1,Spc(5);”5 leading spaces” ‘先输出5个空格,再输出字符串 Print #1,Tab(10);”Hello” ‘在第10列上输出字符串 Close #1 ‘关闭文件 例用Print 语句把数据写入文件
Private Sub Form_Load() Dim i As Integer, s As String Dim d As Date, b As Boolean i = 125: s = "programming": d = Date: b = True Open "d:\vb\example.txt" For Output As #1 Write #1, i, s, d, b Write #1, "使用Write语句向顺序文件中写入数据示例" Close #1 End Sub 例 用Write 语句把数据写入文件
Write 的功能基本上与Print 语句相同,不同的是,数据写入文件时是以紧凑格式存放的,也就是说,使用Write语句,数据项之间会以 “,”自动隔开,并自动给字符串加上双引号。 Write语句在将输出列表中的最后一个字符写入文件后会插入回车换行符。 Write 语句与Print 语句比较
(1)LOF()函数 LOF()函数将返回文件的字节数。例如,LOF(1)返回#1文件的长度,如果返回0,则表示该文件是一个空文件。 (2)EOF()函数 EOF()函数将返回一个表示文件指针是否达到文件末尾的值。当到文件末尾时,EOF()函数返回True,否则返回False。对于顺序文件用EOF()函数可以测试是否到文件末尾。对于随机文件和二进制文件,当最近一个执行的Get语句无法读到一个完整记录时返回True,否则返回到False。 (3)LOC()函数 LOC()函数将返回在一个打开文件中读写的记录号;对于二进制文件,它将返回最近读写的一个字节的位置。 与文件读操作有关的其他重要函数
1.Line Input #语句 每次从顺序文件中读取一行信息,并赋值给一个字符串变量,语法格式如下 Line Input #文件号,字符串变量 2.读操作顺序文件读文件的操作方式有如下三种:Line Input # 语句Input # 语句Input 函数
【7-3】对于例7-1所建立的文件,可以使用Line Input #语句将数据读出,并显示在窗体中。 Private Sub Form_Click() Dim st As String, x As String Open "d:\vb\exercise.txt" For Input As #1 While Not EOF(1) Line Input #1, x ‘每次从文件中读一行信息 st = st & vbCrLf & x ‘使用vbCrLf实现换行显示 Wend Close #1 Print st End Sub
9.3 顺序文件 2.Input #语句Input #语句从一个打开的顺序文件中读出数据,并赋值给指定的变量,其语法格式如下: Input #文件号,变量列表
格式: Input (<读取的字符数>,#<文件号>) 功能: 调用该函数可以读取指定数目的字符,以字符串形式返回。 9.3 顺序文件 (3)Input函数
【例7-4】新建立一个工程文件,并按照下列要求进行操作:在名称为Form1的窗体上画一个文本框,名称为Text1,允许多行显示;再画三个命令按钮,名称分别为C1,C2,C3,标题分别为“输入”,“转换”,“存盘”。请编写适当的事件过程,使得在运行时,单击“输入”按钮,从D盘VB文件夹中读入in5.txt文件(文件中只有字母和空格),放入Text1中;单击“转换”按钮,则把Text1中的所有小写字母转换为大写字母;单击“存盘”按钮,则把Text1中的内容存入out5.txt文件中。【例7-4】新建立一个工程文件,并按照下列要求进行操作:在名称为Form1的窗体上画一个文本框,名称为Text1,允许多行显示;再画三个命令按钮,名称分别为C1,C2,C3,标题分别为“输入”,“转换”,“存盘”。请编写适当的事件过程,使得在运行时,单击“输入”按钮,从D盘VB文件夹中读入in5.txt文件(文件中只有字母和空格),放入Text1中;单击“转换”按钮,则把Text1中的所有小写字母转换为大写字母;单击“存盘”按钮,则把Text1中的内容存入out5.txt文件中。
Private Sub Form_Click() Dim x As Single,amax As Single,amin As Single Dim i As Integer Open "in.txt" 【1】 As #1 Input #1,x amax=x amin=x i=2 Do While i<=100 Input #1,x Print x; If amax<x Then amax=x End If If amin>x Then amin=x End If i=i+1 Loop Close #1 Print amax,amin Open "out.txt" 【2】 As #2 【3】 amax,amin close #2 End Sub 左边程序的功能是:从文件in.txt中读取100个学生的数学成绩,将其中的最高分数和最低分数写到文件out.txt中。请将程序填完全。 【1】A) Input B) For Input C) For Output D) Output B 【2】A) For Output B) For Input C) Output D) Input A 【3】A) Write B) Print C) Write #2 D) Print #2, D
下列程序代码是通过打开顺序文件DATA.TXT,读取文件中的数据,并在窗体上显示。完善该程序,实现上述功能。下列程序代码是通过打开顺序文件DATA.TXT,读取文件中的数据,并在窗体上显示。完善该程序,实现上述功能。 Private Sub Command12_Click() Dim StuName As String, StuXb As String, StuScore As Single Open "d:\vbtest\data.txt" For 【1】 As #1 Do While 【2】 【3】, StuName, StuXb, StuScore Print StuName, StuXb, StuScore Loop Close #1 End Sub 【1】A) Append B) Input C) Random D) OutPut B 【2】A) Not EOF(1) B) EOF(1) C) LOF(1) D) Not LOF(1) A 【3】A) Input #1 B) Read #1 C) Get #1 D) Line Input #1 A
在随机访问模式中,文件的存取是按记录进行操作的,每个记录都有记录号并且长度全部相同。那么无论是从内存向磁盘写数据或从磁盘读数据,都需要事先定义内存空间。而内存空间的分配是靠变量说明来进行的,所以不管是读操作还是写操作,都必须事先在程序中定义变量,变量要定义成随机文件中一条记录的类型,一条记录又是由多个数据项组成的。因此在程序的变量说明部分采用用户自定义的类型说明语句,首先定义记录的类型结构,然后再将变量说明成该类型,这样就为这个变量申请了内存空间用于存放随机文件中的记录。在随机访问模式中,文件的存取是按记录进行操作的,每个记录都有记录号并且长度全部相同。那么无论是从内存向磁盘写数据或从磁盘读数据,都需要事先定义内存空间。而内存空间的分配是靠变量说明来进行的,所以不管是读操作还是写操作,都必须事先在程序中定义变量,变量要定义成随机文件中一条记录的类型,一条记录又是由多个数据项组成的。因此在程序的变量说明部分采用用户自定义的类型说明语句,首先定义记录的类型结构,然后再将变量说明成该类型,这样就为这个变量申请了内存空间用于存放随机文件中的记录。 6.3 随机文件
1.打开随机文件 格式: Open 文件名For Random As # 文件号[Len=记录长度] 其中:文件名可以是字符串常量,也可以是字符串变量。文件以随机访问模式打开后,可以同时进行读或写的操作。在Open语句中要指明记录的长度,记录长度的默认值是128个字节。 例如,用随机方式打开D盘根目录下MyDoc文件夹中的MyData1.txt文件,记录长度为100个字节: Open "D:\MyDoc\Mydata1.txt " For Random As #1 Len=100 2.关闭随机文件 与关闭顺序文件相同,仍用Close语句。 6.3.1随机文件的打开与关闭
1.写操作 随机文件的写操作使用Put 命令。 格式:Put # <文件号> ,[<记录号>], <表达式> 其中:<记录号>指定写到文件中的几个记录上。如果省略,则表示在当前记录后插入一条记录。记录号应为大于1的整数。 <表达式> 是要写入文件的数据,可以是变量。 Put 命令将表达式的值写入由记录号指定的记录位置处,同时覆盖原记录内容。随机文件的操作不受当前文件中的记录数的限制。 6.3.2 随机文件的读写操作
随机文件的读操作使用Get命令。 格式:Get # 文件号,[<记录号>] ,变量名 Get命令将指定的记录内容存放到变量中。记录号为大于1的整数。如果省略记录号,则表示读取当前记录。 2.读操作
例:有一随机文件Data.txt,其记录包含三个字段StuNo、StuName、StuScore类型定义如程序描述。下列程序代码是打开该随机文件,通过文本框Text1、Text2和Text3分别输入学生的学号(StuNo)、姓名(StuName)和成绩(StuScore),并添加到随机文件中,而后关闭该文件。完善该程序,实现上述功能。例:有一随机文件Data.txt,其记录包含三个字段StuNo、StuName、StuScore类型定义如程序描述。下列程序代码是打开该随机文件,通过文本框Text1、Text2和Text3分别输入学生的学号(StuNo)、姓名(StuName)和成绩(StuScore),并添加到随机文件中,而后关闭该文件。完善该程序,实现上述功能。 记录的自定义类型如下: Public Type student StuNo As String * 6 StuName As String * 6 StuScore As Single End Type
Private Sub Command1_Click() Dim Stud As student Open "d:\data.txt" For 【1】As #1 Len = 【2】 Stud.StuNo = Text1.Text Stud.StuName = Text2.Text Stud.StuScore = Val(Text3.Text) N = Int(LOF(1) / Len(Stud)) + 1 【3】, N, Stud Text1 = "": Text2 = "": Text3 = "" Text1.SetFocus Close #1 End Sub 【1】A) Append B) Input C) Random D) OutPut C 【2】A) Len(Student) B) Len(Stud) C) Stud D) Student B 【3】A) Put #1 B) Input #1 C) Get #1 D) Write #1 A
1.打开文件 格式:Open 文件名For Binary As # 文件号 注意:以二进制方式访问文件不指定记录长度。 2.关闭文件 关闭打开的二进制文件仍用Close命令。 6.4 二进制文件 6.4.1打开与关闭二进制文件
1. 写操作 格式:Put #<文件号>,[<位置>],<变量名> 功能:Put命令从<位置>指定的字节数后开始,一次写入长度等于变量长度的数据,如果忽略<位置>,则表示从文件指针所指的当前位置开始写入。 2.读操作 格式:Get #<文件号>,[<位置>],<变量名> 功能:Get命令从指定位置开始读取长度等于变量长度的数据,并存放到变量中,如果省略位置,则从文件指针所指的位置开始读取,数据读出后移动变量长度的位置。 6.4.2二进制文件读写操作
文件的位置 • 每个打开的二进制文件都有自己的文件指针,文件指针是一个数字值,指向下一次读写操作在文件中的位置。
6.5.1文件操作语句 1.FileCopy语句 格式:FileCopy 源文件名,目标文件名 功能:复制一个文件。 举例: FileCopy "D:\Myfile\ABC.doc ", "A:\ABC.doc" ′将D盘Myfile文件夹中的ABC.doc 文件复制到A盘的ABC.doc文件中。 注意:FileCopy语句不能复制一个已打开的文件,否则,将会产生一个错误。
格式:Kill 文件名 功能:从磁盘中删除文件。 举例:Private Sub Command1_Click() answer=MsgBox"确定要删除文件吗?",vbYesNo, "请确认") If answer=vbYes Then Kill "D:\Myfile.dat" End Sub 注意:因为在使用Kill语句删除文件时不会出现任何提示,所以应在程序中加上适当的代码以提示用户确认后再删除。 2.Kill语句
3.Name语句 格式:Name 旧文件名As 新文件名 功能:重新命名一个文件、目录或文件夹。 举例: Name "D:\Myfile\ABC.doc"As"C:\New\ABC.doc" ′将D盘Myfile文件夹中的ABC.doc 文件移到C盘New文件夹中并更名为ABC.doc。 注意: (1)该语句应指定已存在的新、旧文件名和位置,不能使用通配符"*"和"?"。 (2)该语句不能创建新文件、目录或文件夹。 (3)该语句不能重新命名一个已打开的文件,否则,将会产生一个错误。
4.ChDrive语句 格式:ChDrive 驱动器名 功能:改变当前的驱动器的位置。 举例:ChDrive "D"与ChDrive "D:\ "都是将当前的驱动器设为D盘。 注意:驱动器名如果是一个空字符串" ",则当前的驱动器将不会改变。
5.ChDir语句 格式:ChDir 路径 功能:改变当前的目录或文件夹。 举例:ChDir "D:\Myfile" 注意:ChDir 语句改变默认的目录位置,但不会改变默认驱动器的位置。如果默认的驱动器是C盘,那么上面的语句改变的只是驱动器D上的默认目录,而C盘仍是默认的驱动器。 6.MkDir语句 格式:MkDir 路径 功能:创建一个新的目录或文件夹。 举例:MkDir "D:\Myfile\ABC" '在D盘的Myfile文件目录中名为ABC的子目录。 注意:如果没有指定驱动器,则MkDir会在当前的驱动器上创建新的目录或文件夹。
7。RmDir语句 格式:RmDir路径 功能:用于删除一个存在的空的目录或文件夹。 举例:RmDir "D:\Myfile\ABC" '删除D盘的Myfile文件目录中名为ABC的空子目录。 注意:RmDir只能删除空子目录,否则,将会产生一个错误。在试图删除目录或文件夹之前,可先用Kill语句删除所有的文件,再用RmDir语句删除它的上一级目录。
1. CurDir函数 功能:获得当前目录。 调用格式:CurDir(文件名) 说明:返回一个Variant(String),用来表示当前路径。 2.GetAttr函数 功能:获得文件属性。 调用格式:GetAttr(文件名) 3.FileDateTime函数 功能:获得文件的日期和时间。 调用格式:FileDateTime(文件名) 说明:返回一个文件最初创建或最后修改的日期和时间。 6.5.2 文件操作函数
4.FileLen函数 功能:获得文件的长度,单位是字节。 调用格式:FileLen(文件名) 注意:返回一个Long,文件打开时调用FileLen函数,则返回的值是文件打开之前的长度。
(一)文件的概念 VB中根据访问模式将文件分为:顺序文件、随机文件、二进制文件。顺序文件可以按行、按字符和整个文件一次性读三种方式读出;随机文件以记录为单位读出;二进制文件以字节为单位读出。 本章小结
顺序文件结构简单,其中记录的写入、存放、读取顺序都是一致的,也就是说记录的逻辑顺序与物理顺序相同。顺序文件可以用普通的字处理软件(如:记事本)进行建立、显示和编辑。顺序文件结构简单,其中记录的写入、存放、读取顺序都是一致的,也就是说记录的逻辑顺序与物理顺序相同。顺序文件可以用普通的字处理软件(如:记事本)进行建立、显示和编辑。 1。打开顺序文件:Open文件名For模式As[#]文件号[Len=记录长度] 2.写语句格式:Print # <文件号>,[<输出列表>] 或Write # <文件号>,[<输出列表>] 3.读语句格式:Get # 文件号,[<记录号>] ,变量名 4.关闭文件格式:Close [[#]文件号][,[#]文件号]…… 常用函数:LOF()函数、EOF()函数和Loc()函数。 本章小结 (二) 顺序文件及操作
随机文件由一组长度完全相同的记录组成。每个记录都有惟一的记录号。随机文件以二进制形式存放数据。随机文件适宜对某条记录进行读写操作。随机文件由一组长度完全相同的记录组成。每个记录都有惟一的记录号。随机文件以二进制形式存放数据。随机文件适宜对某条记录进行读写操作。 1.打开随机文件格式:Open 文件名For Random As # 文件号[Len=记录长度] 2.写语句格式: Put # <文件号> ,[<记录号>] ,<表达式> 3.读语句格式: Get # 文件号,[<记录号>] ,变量名 4.关闭文件格式:Close [[#]文件号][,[#]文件号]…… 本章小结 (三) 随机文件及操作