Visual Basic 程序设计甘肃农业大学信息科学技术学院
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 8章 文 件
文件是以特定的方式存储在计算机外部存储器上的数据的集合,是计算机输入、输出的对象,文件以文件名为标识。要访问或处理数据,计算机必须先找到指定的文件,然后从文件中读取数据,
进行处理。
Visual Basic 具有较强的文件处理能力,为用户提供了多种处理方法。提供了文件系统控件,以及大量的与文件管理有关的语句和函数。可以处理顺序文件、随机文件和二进制文件等。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 8章 文 件
8.1 文件系统控件
8.2 文件及其基本操作
8.3 文件的分类及其应用
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 8章 文 件
文件系统控件有:
– 驱动器列表框( DriverListBox)
– 目录列表框( DirListBox)
– 文件列表框( FileListBox)。
文件系统控件能自动执行文件数据获取任务,用户也可以编写代码,自定义控件的外观并指定显示的信息。用户可以单独使用或组合起来使用文件系统控件,生成操作方便的文件系统对话框
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1 文件系统控件
8.1.1 驱动器列表框和目录列表框
8.1.2 文件列表框
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1.1 驱动器列表框和目录列表框
驱动器列表框控件( DriveListBox)
– 驱动器列表框控件的外观与组合框相似,用来显示驱动器名称,在工具箱中的图标。
– 缺省时驱动器列表框显示当前驱动器名称。用户可以输入任何有效的驱动器名称,也可以单击右侧的下拉箭头,把系统中所有的驱动器全部下拉显示出来,从中选定一个驱动器,即可把它变为当前驱动器,在列表框的顶部显示。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1.1 驱动器列表框和目录列表框
驱动器列表框及目录列表框、文件列表框都有许多标准属性,如,Name,Enable,Top,Left,Width,Height、
Visible,FontName,FontBold,FontItalic,FontSize等。
除此之外,驱动器列表框还有一个 Drive属性,该属性用来返回或设置所选择的驱动器名。 Drive属性只能用程序代码设置,不能在设计时通过属性窗口设置。其格式为:
控件名称,Drive [=驱动器名 ]
– 这里的“驱动器名”是指定的驱动器,如果省略,则 Drive属性默认的是当前驱动器。如果所选择的驱动器在当前的系统中不存在,
则产生错误。
– 每次重新设置驱动器列表框的 Drive属性时,都将触发驱动器列表框的 Change事件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1.1 驱动器列表框和目录列表框
目录列表框控件( DirListBox)
– 目录列表框控件用来显示当前驱动器上的目录和路径。外观与列表框相似,用来显示用户系统当前驱动器的目录结构(目录树)。
– 在窗体上创建目录列表框时,目录列表框默认显示的当前目录为 Visual Basic的安装目录,目录列表框将显示当前目录名及其下一级目录名,
如果用户选中某一个目录名,并双击它,将打开该目录,显示其子目录的结构。如果目录列表较多,将自动添加一个滚动条。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1 文件系统控件
8.1.1 驱动器列表框和目录列表框
8.1.2 文件列表框
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1.2 文件列表框
文件列表框控件( FileListBox)用来显示指定目录中所包含的指定类型的文件,外观与列表框形似。
文件列表框属性
– Pattern属性
用来设置在运行时显示在 FileListBox控件中的文件类型。该属性可以在设计时用属性窗口设计,也可以运行时通过代码设置。在默认情况下,Pattern的属性值为 *.*,即所有文件。
– FileName属性
返回或设置所选文件的文件名。该属性只能在运行时通过代码设置,
不能在设计时用属性窗口设置。
– ListCount,ListIndex,List,MultiSelect属性
ListCount属性返回控件内所列项目的总和;
ListIndex属性返回或设置控件上所选择的项目的“索引值”(即下标);
List属性中存有文件列表框中所有项目的数组,可用来返回或设置某一项目;
MultiSelect属性返回或设置一个值,该值指示是否能够在 FileListBox
控件中进行复选以及如何进行复选。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1.2 文件列表框
文件列表框事件
– 文件列表框最常用的事件是 Click事件和
DblClick事件。利用 DblClick事件,可以执行文件列表框中的某个可执行文件。也就是说,只要双击文件列表框中的某个可执行文件,就能执行该文件。通过 Shell函数来实现。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1.2 文件列表框
【 例 8-1】 图形浏览器的设计 。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 8章 文 件
8.1 文件系统控件
8.2 文件及其基本操作
8.3 文件的分类及其应用
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2 文件及其基本操作
8.2.1 文件与文件结构
8.2.2 文件的基本操作
8.2.3 目录及文件操作
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.1 文件与文件结构
文件结构
– 为了能有效地存取数据,数据必须以某种特定的方式存储,这种特定的方式称为文件结构。 Visual Basic文件由记录组成,记录由字段组成,字段由字符组成。
– 字符( Character)
是构成文件的最基本单位。字符既可以是字母、数字等 ASCII码字符,
也可以是汉字。
– 字段( Field)
由若干字符组成的一项数据。例如,学号,95001”就是一个字段,而姓名“张三”也是一个字段。
– 记录 ( Record)
由一组相关字段组成。例如,一个学生记录可以由学号、姓名、性别等字段组成。若干个记录的集合就组成了文件。
– 文件 ( File)
由记录构成,一个文件含有一个以上记录。例如,在学生文件中有
100人的信息,每个人的信息是一个记录,100个记录构成一个文件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.1 文件与文件结构
在 Visual Basic中根据文件结构和访问方式,
将文件分为三类:
– 顺序存取文件
– 随机存取文件
– 二进制存取文件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.1 文件与文件结构
文件的分类
– 根据不同的标准,文件可以分为不同的类型。
– ( 1)根据文件存储数据的性质可以分为程序文件和数据文件
程序文件( Program file)存储的是可以由计算机执行的程序,包括源文件和可执行文件等,在 Visual
Basic中的窗体文件、模块文件、类文件和工程文件等都是程序文件。
数据文件( Data file)存储的是各种数据。例如学生信息、职工工资等。这类数据必须通过程序存取和管理。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.1 文件与文件结构
文件的分类
– 根据文件的存取方式和结构分为顺序文件和随机文件
顺序文件( Sequential file)的结构比较简单,文件中的记录一个接一个的顺序存放。在这种文件中要读取某个数据,必须从文件头开始,一个记录一个记录地顺序读取。
– 顺序文件的组织比较简单,占用空间少、容易使用,但维护困难,
不能灵活地存取和增减数据。要修改文件中的某个记录,必须把整个文件读入内存,修改完后再重新写入磁盘。因此,顺序文件适用于有一定规律且不经常修改的数据存储。
随机文件( Random file)又称直接存取文件,可以不必考虑记录的位置,根据需要直接访问文件中的任意记录。在随机文件中,每个记录的长度都是固定的,记录中字段的长度也是固定的,每个记录都有一个记录号。可以根据记录号,直接存取 随机文件中的记录。
– 随机文件具有存取灵活、易于修改、访问速度快等优点。但占用空间比较大,组织结构比较复杂。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.1 文件与文件结构
文件的分类
– 根据文件中数据的编码方式可以分为 ASCII码文件和二进制文件
ASCII码文件又称文本文件,文件中的数据都是以
ASCII码字符的方式存储的,这种文件可以用普通的字处理软件打开编辑(以纯文本文件方式保存)。
二进制文件是指文件的数据以二进制的方式存储,
占用空间较小。但二进制文件不能用普通的字处理软件进行编辑。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2 文件及其基本操作
8.2.1 文件与文件结构
8.2.2 文件的基本操作
8.2.3 目录及文件操作
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
在 Visual Basic中,数据文件的操作按以下步骤进行。
– 打开(或建立)文件。一个文件必须先打开或建立后才能使用。
如果一个文件已经存在,则打开该文件;如果不存在,则建立该文件。文件打开后都有相应的文件号与之相关。文件号是一个整数,可以看作是文件的代表。在文件读写时都要指定文件号。
– 对文件进行处理。根据用户的需要,在打开或建立的文件上执行所要求的输入输出操作。在文件处理中,把内存中的数据传输到相关的设备上(如磁盘)并作为文件存放的操作叫做写数据。而把数据文件中的数据传输到内存中的操作,叫做读数据。
– 关闭文件。将数据写入文件,并释放相关的资源。
在 Visual Basic中,数据文件的操作通过操作语句和函数来实现。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的打开
– 对文件进行操作之前,必须先打开或建立文件。 Visual
Basic用 Open语句打开或建立一个文件,其格式为:
Open 文件名 [For方式 ][Access存取类型 ][Lock] As [#]文件号 [Len=记录长度 ]
– Open语句的功能是:为文件的输入输出分配缓冲区,
确定缓冲区所使用的存取方式。
– 说明:
( 1)格式中的 Open,For,Access,As以及 Len为关键字;
文件名指要打开文件的名称,包括文件的路径。当前目录(文件夹)下,可以只有文件名。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的打开
– ( 2) For方式,指定文件输入输出方式,共有以下 5种方式,缺省为 Random。
Input:以输入方式打开顺序文件,文件指针定位在文件开头,
只能读取文件。
Output:以输出方式打开顺序文件,文件指针定位在文件开头,只能向文件写入内容。如果打开的文件中已有内容,则覆盖原有内容(相当于打开了一个空文件)。
Append:以输出方式打开顺序文件,文件指针定位在文件尾,
只能向文件写入内容。与 Output不同的是,如果打开的文件中已有内容,并不覆盖原有内容,而是从文件的尾部开始继续写入数据,即追加文件内容。
Binary:以二进制方式打开文件。
Random:以随机方式打开文件,这是缺省的操作方式,即当
For关键字省略时,文件以随机方式打开。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的打开
– 用 Open语句可以打开或建立一个文件。用
Open语句打开文件时,如果指定的文件不存在,以 Input方式打开时将会出现错误,而以
Output,Append,Binary和 Random方式打开时将建立相应的文件。在 Binary,Input和
Random方式下,可以用不同的文件号打开同一文件,而不必先将该文件关闭。而在
Append和 Output方式下,如果要用不同的文件号打开同一文件,则必须在打开文件之前先关闭该文件,
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的打开
– 说明:
( 3) Access 存取类型,用来指定存取文件的类型。
有以下 3种方式:
– Read:以只读方式打开文件。
– Write:以只写方式打开文件。
– Write/Read:以读 /写方式打开文件(允许读也允许写),
这是缺省的方式。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的打开
– 说明:
( 4) Lock锁定,用于在多用户或多进程环境中限制其他用户或进程对打开文件的操作。锁定的类型有以下 4种:
– Lock Shared:任何用户或进程都可以读写该文件。
– Lock Read:不允许其他用户或进程读该文件。
– Lock Write:不允许其他用户或进程写该文件。
– Lock Write/Read:不允许其他用户或进程读写该文件,
这是锁定的缺省值。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的打开
– 说明:
( 5)文件号,用来标识打开文件的文件句柄,是一个整数表达式,其值在 1~ 511之间的范围内。对打开文件的读写操作都要使用文件号。
( 6)记录长度,是一个整型表达式。对于随机文件,该值是记录长度;对于顺序文件,该值是缓冲字符数;对于二进制文件,将忽略 Len子句。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的关闭
– 文件的读写操作结束后,应将文件关闭。可以通过
Close语句来实现。其语法格式为:
Close [[ # ]文件号 ] [,[ # ]文件号 ]……
– Close语句用来结束文件的输入输出操作。
– 说明:
Close语句用来关闭文件,是打开文件以后的操作。文件号是用 Open语句打开文件时,给文件分配的文件号。关闭一个数据文件具有两方面的作用,一是把文件缓冲区的所有数据写到文件中,二是释放与该文件相关的文件号,供其他 Open语句使用。
Close可以关闭多个文件,如果指定了文件号,则把指定的文件关闭;如果省略所有的文件号,则关闭打开的所有文件。
除了用 Close语句关闭文件外,在程序结束时,系统将自动关闭所有打开的数据文件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的读写
– 文件的主要操作是读和写,文件的读写过程中使用了许多语句和函数,这儿先介绍这些语句和函数的使用,
文件的读写操作将在后面各节介绍。
– FreeFile函数
使用 FreeFile函数可得到一个在程序中没有使用的文件号,该函数返回一个整型数据。当在程序中打开多个文件时非常有用,
可以避免出现相同的文件号。该函数语法格式如下:
FreeFile[(范围 )]
参数“范围”是可选参数,用来决定返回的文件号的取值范围。
缺省值为 0,当参数为 0时,则返回一个介于 1~ 255之间的文件号。为 1时,则返回一个介于 256~ 511之间的文件号。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的读写
– Loc函数
Loc函数返回由“文件号”指定的指定文件的当前读写位置。是一个长整型值其语法格式如下:
Loc(文件号 )
Loc函数对于随机文件,返回上一次读取或写入的记录号;对于二进制文件,返回上一次读取或写入的字节位置;对于顺序文件,返回的是该文件打开以来读或写的记录个数,一个记录是一个数据块。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的读写
– LOF函数
LOF函数返回一个长整型值,表示用 Open语句打开的文件的大小,该大小以字节为单位。其语法格式如下:
LOF(文件号 )
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的读写
– Lock和 Unlock语句
在多用户或多进程环境中,可以用 Lock和 Unlock语句限制其他用户或进程对打开的全部文件或部分文件的访问控制。在使用
Lock和 Unlock语句时,这两个语句总是成对出现。其语法格式为:
Lock[ # ] 文件号 [,记录 |[开始 ] To 结束 ]
Unlock[ # ] 文件号 [,记录 |[开始 ] To 结束 ]
对于不同类型的文件,“记录”、“开始”、“结束”的含义不一样。对于二进制文件,它们代表从文件开头起算的字节号,
文件的第一个字节的字节号是 1;对于随机文件,它们代表文件开头起算的记录号,文件的第一个记录的记录号是 1。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的读写
– FileAttr函数
FileAttr函数用于返回打开文件的信息。其语法格式如下:
FileAttr(文件号 [,返回值类型 ])
返回值类型是可选参数,只能取两个值 1(缺省值)
和 2。当该属性值为 1(或缺省)时,返回打开文件的方式。当该属性值为 2时,返回打开文件的句柄。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的读写
– EOF函数
EOF函数用于测试文件的结束标志,可以避免因试图在文件结尾处进行输入而产生的错误。其语法格式如下:
EOF(文件号 )
对于用 Input方式打开的顺序文件,如果已经读到文件尾,则返回 True,否则返回 False。对于以 Output,Append打开的顺序文件,EOF函数总返回 True。
对于随机文件,如果最后执行的 Get(读数据)语句未能读出完整的记录时,EOF函数返回 True,否则返回 False。
EOF函数通常用来在循环读数据时测试是否已到文件尾,
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2 文件及其基本操作
8.2.1 文件与文件结构
8.2.2 文件的基本操作
8.2.3 目录及文件操作
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
文件及目录的基本操作
– 删除文件( Kill)
用 Kill语句来删除文件。其语法格式为:
Kill 文件名
– 拷贝文件( FileCopy)
用 FileCopy语句来拷贝文件。其语法格式为:
FileCopy 源文件名,目标文件名
源文件名和目标文件名都可以包含路径,但不能含有通配符。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
文件及目录的基本操作
– 文件(目录)重命名( Name)
可以用 Name语句来修改一个文件或目录的名称。
其语法格式为:
Name 原文件名 As 新文件名
原文件名和新文件名都可以包含路径,但不能含有通配符。
一般情况下,原文件和新文件都在同一个目录下。
如果原文件和新文件不在同一个目录下,则 Name
语句把原文件移动到新文件所在的目录,并更改文件名为新文件名。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
文件及目录的基本操作
– 建立目录( MkDir)
使用 MkDir语句建立目录。其语法格式为:
MkDir 目录名
– 删除目录( RmDir)
使用 RmDir语句删除目录。其语法格式为:
RmDir 目录名
删除目录时,所删除的目录应为空目录,即该目录下没有任何文件及子目录。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
文件及目录的基本操作
– 改变目录( ChDir)
使用 ChDir语句改变当前目录。其语法格式为:
ChDir 路径
ChDir可以改变当前目录,但不能改变当前驱动器。
– 改变驱动器( ChDriver)
使用 ChDriver语句改变当前驱动器。其语法格式为:
ChDriver [驱动器 ]
如果参数“驱动器”省略,则不会改变当前驱动器。
如果“驱动器”有多个字母,则以首字母为准。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
文件及目录的基本操作
– 获得当前目录( CurDir)
使用 CurDir语句可以确定任何一个驱动器的当前目录。其语法格式为:
CurDir [驱动器 ]
如果参数“驱动器”省略,则返回当前目录的驱动器。
– 获得文件及目录的属性( GetAttr)
使用 GetAttr语句获得文件及目录的属性。其语法格式为:
GetAttr 目录名
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
文件及目录的基本操作
– 可以用以下方式判断文件或目录的属性,如:
If ff And vbReadOnly Then Print "ReadOnly"
其中用 vbReadOnly 表示是否为只读。类似的判断值还有:
vbArchive 是否为归档文件
vbHidden 是否为隐藏文件
vbSystem 是否为系统文件
vbNomal 是否为普通文件
vbDirecory 是否为目录
– 另外,还可以用 FileLen函数来获得文件大小,用
FileDate函数获得文件建立时间
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
文件查找
– 文件查找在文件操作中相当常用,这儿介绍在一个目录中查找所有文件或某类文件的方法。使用查找的基本函数 Dir函数。其语法格式为:
Dir( 字符串 ) 及 Dir
– 其中,字符串是待查找的文件名,可以含有路径及通配符。 Dir(字符串 )用于首次查找,以后每次查找可以只使用 Dir而不带参数。 Dir函数的返回值代表每次查找得到的文件名。若返回值为空,则表示没找到。
– 由于找到的文件可能有多个,所有 Dir函数常用于循环中。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
【 例 8-2】 使用 Dir函数来查找文件。
– 本例中通过循环来找到多个文件,将找到的文件加入到一个列表框( List1)中,如图所示。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 8章 文 件
8.1 文件系统控件
8.2 文件及其基本操作
8.3 文件的分类及其应用
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3 文件的分类及其应用
8.3.1 顺序文件
8.3.2 随机文件
8.3.3 二进制文件
8.3.4 应用实例
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
顺序文件是按行存储的,记录的逻辑顺序和存储顺序是一致的。对顺序文件的读写操作只能一个记录一个记录地顺序进行。顺序文件的读写操作和标准输入输出十分相似。
顺序文件的写操作
– 数据文件的写操作分三步,即打开文件、写入文件和关闭文件。其中打开和关闭文件是由 Open和 Close语句完成的。
– 顺序文件的写操作可以用 Print #或 Write #语句来完成。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
顺序文件的写操作
– Print #语句
Print #语句的功能是把数据写入打开的文件中。其语法格式如下:
Print #文件号,[[Spc(n)|Tab[(n)]] [表达式 ] [;|,]]
说明:
– 和 Print方法相似,如果 Print #语句后面的“表达式”省略,则向文件中写入一个空行。如果 Print #语句最后一项参数后面没有以分号或逗号结束,则下次 Print #语句将把数据写到文件的下一行。
– 和 Print方法一样,Print #语句的各项参数直接可以用分号或逗号隔开,分别对于紧凑格式和标准格式。
– 为了能正确读取输出的文件,除了数值数据可以用 Print #语句写入到文件外,其他类型的数据尽量使用 Write #语句写入
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
【 例 8-3】 随机生成 100个 1~ 100间的正整数,并存入到文件,out.dat”中。
– 程序代码如下:
Private Sub Command1_Click()
Dim i As Integer,x As Integer
Randomize
Open "out.dat" For Output As #1
For i = 1 To 100
x = Int(Rnd * 100) + 1
Print #1,x;
Next
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
– Wrtie #语句
Wrtie #语句也是用来把数据写入到文件中。其语法格式为:
Write #文件号,表达式
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
– Write #语句和 Print #语句的功能类似,都是把数据写入到文件中。但是 Write #语句和 Print #语句有以下几点区别:
1) Write #语句没有 Spc函数和 Tab函数来控制输出位置。
2)表达式依然可以由多项组成,各项之间用逗号或分号分隔。
但在 Write #语句中,用逗号或分号分隔的效果是一样的。也就是说,逗号和分号只是一个各项间的分隔符。如果最后一项参数后面没有逗号或分号,那么下一个 Write #语句将从下一行写入数据,否则,下一个 Write #语句在本行继续输出。
3)用 Write #语句向文件写数据的时候,数据以紧凑格式存放。
但 Write #语句能自动在各项数据之间插入逗号,并给字符串数据两端加上双引号。
4)用 Write #语句写入的正数前面没有符号位,即空格。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
顺序文件的读操作
– 顺序文件的读操作可以由 Input #语句,Line Input #语句和 Input函数来完成。
– ( 1) Input #语句
Input #语句用于从文件中读取数据。其语法格式为:
Input #文件号,变量列表
– 说明:
1)“变量列表”可以由一个或多个变量组成,这些变量可以是不同的数据类型。与变量列表相对应,文件中数据项的类型应该和变量列表中变量的类型相同。如果变量为数值类型而数据不是数值类型,则指定变量的值为零。
2) Input #语句把读出的数据赋给数值型变量时,首先从文件中读取字符串,将忽略数值前面的空格、回车和换行符,从遇到的第一个非空格、回车和换行字符开始读取,遇到空格、回车、换行符或逗号则结束读取。然后相当于对读出的字符串运用 Val函数,从字符串中取出数值赋给变量。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
顺序文件的读操作
– 说明:
3) Input #语句把读出的数据赋给字符串变量时,同样忽略数值前的空格、回车和换行符,遇到回车、
换行或逗号结束读取。但如果有双引号把一串字符括起来,则读取双引号中所有的字符(包括逗号、
回车、换行),并赋给字符串变量。 Input #语句将忽略双引号。
4)读取文件时要注意文件的结尾,如果已经到达文件的结尾继续读数据的话,将产生错误。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
【 例 8-5】 读入例 8-4写入文件,out.dat”中的学号、
姓名、年龄,并打印到窗体上。
Private Sub Command1_Click()
Dim Age As Integer
Dim Name As String,Num As String
Open "c:\out.dat" For Input As #1
Print "学号 ","姓名 ","年龄 "
Do While Not EOF(1)
Input #1,Num,Name,Age
Print Num,Name,Age
Loop
Close #1
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
顺序文件的读操作
– Line Input #语句
Line Input #语句用于从文件中读取一个行,并把它赋给一个字符串变量。其语法格式为:
Line Input #文件号,字符串变量
Line Input #语句读取文件中一个完整行,赋给一个字符串变量。在文件操作中 Line Input #语句十分有用,它可以读顺序文件中一行的全部字符,遇到回车或换行结束读取,但回车和换行不会赋给字符串。
常用于文本文件的处理。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
顺序文件的读操作
– Input函数
Input函数用于从文件中读出 n个字符作为返回值返回。其语法格式为:
Input$(n,文件号 )
Input$函数从文件中读取 n个字符,即使遇到回车和换行也作为字符读出来,并赋值作为字符串返回。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
【 例 8-6】 在窗体上放置一个文本框(名称为
Text1,Multiline属性为 True,ScrollBars属性为 2)
和一个命令按钮(名称为 Cmd1,标题为,200-
400间素数”),单击按钮把 200到 400之间的所有素数显示在文本框中,并计算出所有素数的和,
把结果保存在,out.dat”文件中。
– 已经给出了一个标准模块 mode.bas,其中 putdata过程可以把结果存入指定文件。把标准模块 mode.bas添加到工程中,利用已经给出的 putdata过程存储计算结果
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
【 例 8-7】 单击“读取数据”按钮从文件
,in.txt”中读取 100个整数,存放在一个数组中(下界为 1),同时在文本框中显示这
100个数。单击“计算保存”按钮,计算前
20个数的和并保存到文件中。要求定义一个过程把计算结果保存到,result.txt”中。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
【 例 8-8】 单击“读取数据”按钮从文件
,in.txt”中读取 100个整数,存放在一个数组中(下界为 1)。单击“排序保存”按钮,
把数组中的 100个整数从大到小排序,并把排序后的整数显示在文本框中,然后把排序后的整数存储到文件,out.txt”中。要求定义一个过程把指定个数的数组元素存储到,out.txt”中。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3 文件的分类及其应用
8.3.1 顺序文件
8.3.2 随机文件
8.3.3 二进制文件
8.3.4 应用实例
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
可以随机存取的文件称为随机文件。在随机文件中,每个记录的长度是固定的。记录中每个字段的长度也是固定的。
在写入数据时,只要指定记录号,就可以把数据字节存入指定的位置。而在读取数据时,只要给出记录号,就能直接读取该记录。
随机文件可以不必考虑记录的位置,根据需要任意访问文件中的记录。在随机文件中,每个记录的长度都是固定的,
记录中字段的长度也是固定的,每个记录都有一个记录号。
可以根据记录号,直接存取随机文件中的记录。
随机文件以记录为单位进行操作,一般存储的记录都是以
Type…End Type 语句定义的记录型数据(即用户定义型数据)。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件的读写操作
– 随机文件的读写操作一般分为以下 4步:
用 Type…End Type 语句定义数据类型。
以随机方式打开文件。和顺序文件不同,打开随机文件后,可用于写操作,也可用于读操作。格式如下:
Open 文件名 [For Random] As 文件号 Len=记录长度
打开文件时,应注意给出记录长度(也就是用户定义数据类型占用的存储空间),如果省略,则记录的默认长度为 128;如果记录长度比要写入的记录的实际长度短,则会产生一个错误;
如果记录长度比要写入的记录的实际长度长,则可以写入记录,
只是会浪费一些磁盘空间。可以用 Len函数来得到用户定义数据类型的长度。
对文件进行读写操作。
关闭文件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件的读写操作
– 随机文件的读写操作一般分为以下 4步:
用 Type…End Type 语句定义数据类型。
以随机方式打开文件。和顺序文件不同,打开随机文件后,可用于写操作,也可用于读操作。格式如下:
Open 文件名 [For Random] As 文件号 Len=记录长度
打开文件时,应注意给出记录长度(也就是用户定义数据类型占用的存储空间),如果省略,则记录的默认长度为 128;如果记录长度比要写入的记录的实际长度短,则会产生一个错误;
如果记录长度比要写入的记录的实际长度长,则可以写入记录,
只是会浪费一些磁盘空间。可以用 Len函数来得到用户定义数据类型的长度。
对文件进行读写操作。
关闭文件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件的读写操作
– 随机文件的写操作
随机文件的写操作可以用 Put语句来实现。其语法格式如下:
Put #文件号,[记录号 ],变量
Put语句把变量存储到文件的指定记录。记录号可以省略,如果省略记录号,则在上一个 Get或 Put语句之后(或上一个 Seek函数指出的)的下一个记录写入。省略记录号时,用于分界的逗号都必须罗列出来,
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件的读写操作
– 【 例 8-9】 用 Type…End Type 语句定义一个记录数据类型,用来存储每个学生的学号、姓名、
年龄。输入 3个学生的记录,并存储到文件中。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件的读写操作
– 随机文件的读操作
随机文件的读操作可以用 Get语句来实现。其语法格式如下:
Get #文件号,[记录号 ],变量
Get语句从文件中读取指定记录,并存入相应变量中,
和 Put语句相同,记录号可以省略,如果省略记录号,
则在上一个 Get或 Put语句之后(或上一个 Seek函数指出的)的下一个记录读入。省略记录号时,用于分界的逗号都必须罗列出来。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件的读写操作
– 【 例 8-10】 读出例 8-9写入的学生记录,并存储到数组中,然后打印到窗口上 。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件中记录的增加与删除
– 增加记录
在随机文件中增加记录,就是在文件的末尾添加记录。首先找到文件最后一个记录的记录号,然后把要增加的记录写在它的后面。
– 【 例 8-11】 在例 8-9写入的学生记录后添加一个新记录。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件中记录的增加与删除
– 删除记录
通过清除其字段可以删除一个记录,但是该记录仍在文件中存在。通常文件中不能有空记录,因为它们会浪费空间且会干扰顺序操作。最好把余下的记录拷贝到一个新文件,然后删除旧文件。
要清除随机访问文件中删除的记录,一般按如下步骤执行:
– 1)创建一个新文件。
– 2)把所有有用的记录从原文件复制到新文件。
– 3)关闭原文件并用 Kill 语句删除它。
– 4)使用 Name 语句把新文件以原文件的名字重新命名。
【 例 8-12】 删除文件中第 n个学生记录
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
用控件显示和修改随机文件
– 所谓用控件显示和修改随机文件,就是利用控件来显示随机文件的内容,并提供修改功能,
使用户一目了然。下面用一个具体的例子来介绍如何使用控件显示和修改随机文件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
用控件显示和修改随机文件
– 【 例 8-13】 建立如图 8.7所示的界面来显示和修改记录。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3 文件的分类及其应用
8.3.1 顺序文件
8.3.2 随机文件
8.3.3 二进制文件
8.3.4 应用实例
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.3 二进制文件
利用二进制可以存取任意文件的原始字节,即不仅能获取 ASCII文件,而且能读取和修改非 ASCII
格式存储的文件。例如图像文件等。
通过使用二进制访问可以使磁盘空间的使用降到最小。二进制存取方式与随机存取方式一样,使用 Get#语句和 Put#语句进行读写操作。
使用 Open语句可以打开二进制输入输出文件,语法格式如下:
Open 文件名 [For Binary] As #文件号
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.3 二进制文件
二进制存取与随机存取
– 二进制文件与随机文件的存取操作类似,这主要表现在:
– ( 1)不需要在读和写之间切换。在执行 Open语句打开文件后,
对该文件既可以读,也可以写,并且利用二进制存取可以在一个打开的文件中前后移动。
– ( 2)读写随机文件的语句可以用于读写二进制文件,即:
Get | Put #文件号,[位置 ],变量
– 在这里“变量”可以是任何类型,包括变长字符串和记录类型;
“位置”指明下一个 Get或 Put操作在文件的什么地方进行。二进制文件的“位置”相对于文件开头而言。即第一个字节的“位置”
是一,第二个字节的“位置”是二等等。如果省略“位置”,则
Get和 Put操作将文件指针从第一个字节到最后一个字节顺序进行扫描。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.3 二进制文件
二进制存取与随机存取
– Get语句从文件中读出的字节数等于“变量”的长度。同样,Put
语句向文件中写入的字节数与“变量”的长度相同。例如,如果变量为整型,Get#语句把读取的 2个字节赋给变量,如果变量为单精度型,Get就读取 4个字节。如果 Get和 Put语句没有指定“位置”,则文件指针每次移过一个与“变量”长度相同的距离。
– 二进制文件和随机文件也有不同之处,主要是:二进制存取可以移到文件的任一字节的位置上,然后根据需要读、写任意多个字节;而随机存取每次只能移到一个记录的边界上,读取固定个数的字节(一个记录的长度)。
– 二进制文件只能通过 Get语句或 Input$函数读取数据,而 Put则是向以二进制方式打开的文件中写入数据的唯一方法。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.3 二进制文件
文件指针
– 文件打开后,自动生成一个指针(隐含的),文件的读写就从这个指针所指的位置开始。用 Append方式打开文件后,文件的指针指向文件的末尾,而如果用其他几种方式打开文件,则文件指针都指向文件开头。
完成一次读写操作后,文件指针自动移到下一个读写操作的开始位置,移动量由 Open语句和读写语句的相关参数共同决定。对于随机文件,其指针最小移动单位是一个记录的长度;而顺序文件中文件指针移动的长度与它读写的字符串的长度相同。二进制文件中可以把文件指针移到文件中的任意位置。
– 文件指针的定位通过 Seek语句。 Seek语句设置下一个读 /写操作的位置,语法格式为:
Seek [#]文件号,位置
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.3 二进制文件
文件指针
– 说明:
– ( 1)对于用 Binary,Input,Output或 Append方式打开的文件,“位置”是从文件开头到“位置”为止的字节数,即执行下一个操作的地址。对于用 Random方式打开的文件来说,“位置”是指记录号。
– ( 2) Get和 Put语句中的记录号优先于由 Seek语句确定的位置。当“位置”为零或负数时,将产生出错信息
“错误的记录号”。当 Seek语句的“位置”在文件位置后时,对文件的写操作将扩展该文件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.3 二进制文件
文件指针
– 说明:
与 Seek语句配合使用的是 Seek函数,其语法格式如下:
Seek(文件号 )
Seek函数返回当前的读 /写位置,即文件指针的位置,
返回值的类型是长整型。对于用 Binary,Input、
Output或 Append方式打开的文件,返回文件中的字节位置(产生下一操作的位置)。对于用 Random
方式打开的文件,返回的是一个要读或写的记录号。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.3 二进制文件
文件指针
– 在访问二进制文件时,Seek函数与 Loc函数给出相似的结果。所不同的是 Loc函数返回的是最近一次读写过的字节的位置,而 Seek函数返回的是下一次要读写的位置。
– 对于顺序文件,Seek语句把文件指针移到指定的字节位置上,Seek函数返回有关下一次将要读写的位置信息;对于随机文件,Seek语句只能把文件指针移到一个记录的开头,而 Seek函数返回的则是下一个记录号。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3 文件的分类及其应用
8.3.1 顺序文件
8.3.2 随机文件
8.3.3 二进制文件
8.3.4 应用实例
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.4 应用实例
【 例 8-14】 设置一个阅读器,用以显示指定的文本文件,并把阅读器中的文件另存为其他文件,或修改内容后重新存盘。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.4 应用实例
【 例 8-15】 将某班学生考试成绩输入到
“考试成绩”随机文件中。每个学生的记录包含学号、姓名、高等数学成绩、英语成绩和计算机基础成绩五个字段,
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社学完本章你应能够:
掌握文件系统控件的使用;
了解数据文件的概念及分类;
了解与文件使用有关的函数和语句;
理解顺序文件、随机文件等的特点;
掌握顺序文件的建立,数据的读写操作及相关程序设计;
掌握随机文件的建立,数据的读写操作及相关程序设计。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社思 考 题
1.文件的作用是什么? 目录和文件是什么关系?
2,在 Visual Basic中文件操作的一般步骤是什么?
3,随机文件与顺序文件的读写有什么区别?通过什么语句实现?
4,用 Output或 Append两种方式打开顺序文件的区别是什么?
5,二进制文件与随机文件有什么差别?
6,在随机文件文件中增加记录或删除记录的主要操作过程是什么?
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 8章 文 件
文件是以特定的方式存储在计算机外部存储器上的数据的集合,是计算机输入、输出的对象,文件以文件名为标识。要访问或处理数据,计算机必须先找到指定的文件,然后从文件中读取数据,
进行处理。
Visual Basic 具有较强的文件处理能力,为用户提供了多种处理方法。提供了文件系统控件,以及大量的与文件管理有关的语句和函数。可以处理顺序文件、随机文件和二进制文件等。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 8章 文 件
8.1 文件系统控件
8.2 文件及其基本操作
8.3 文件的分类及其应用
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 8章 文 件
文件系统控件有:
– 驱动器列表框( DriverListBox)
– 目录列表框( DirListBox)
– 文件列表框( FileListBox)。
文件系统控件能自动执行文件数据获取任务,用户也可以编写代码,自定义控件的外观并指定显示的信息。用户可以单独使用或组合起来使用文件系统控件,生成操作方便的文件系统对话框
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1 文件系统控件
8.1.1 驱动器列表框和目录列表框
8.1.2 文件列表框
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1.1 驱动器列表框和目录列表框
驱动器列表框控件( DriveListBox)
– 驱动器列表框控件的外观与组合框相似,用来显示驱动器名称,在工具箱中的图标。
– 缺省时驱动器列表框显示当前驱动器名称。用户可以输入任何有效的驱动器名称,也可以单击右侧的下拉箭头,把系统中所有的驱动器全部下拉显示出来,从中选定一个驱动器,即可把它变为当前驱动器,在列表框的顶部显示。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1.1 驱动器列表框和目录列表框
驱动器列表框及目录列表框、文件列表框都有许多标准属性,如,Name,Enable,Top,Left,Width,Height、
Visible,FontName,FontBold,FontItalic,FontSize等。
除此之外,驱动器列表框还有一个 Drive属性,该属性用来返回或设置所选择的驱动器名。 Drive属性只能用程序代码设置,不能在设计时通过属性窗口设置。其格式为:
控件名称,Drive [=驱动器名 ]
– 这里的“驱动器名”是指定的驱动器,如果省略,则 Drive属性默认的是当前驱动器。如果所选择的驱动器在当前的系统中不存在,
则产生错误。
– 每次重新设置驱动器列表框的 Drive属性时,都将触发驱动器列表框的 Change事件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1.1 驱动器列表框和目录列表框
目录列表框控件( DirListBox)
– 目录列表框控件用来显示当前驱动器上的目录和路径。外观与列表框相似,用来显示用户系统当前驱动器的目录结构(目录树)。
– 在窗体上创建目录列表框时,目录列表框默认显示的当前目录为 Visual Basic的安装目录,目录列表框将显示当前目录名及其下一级目录名,
如果用户选中某一个目录名,并双击它,将打开该目录,显示其子目录的结构。如果目录列表较多,将自动添加一个滚动条。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1 文件系统控件
8.1.1 驱动器列表框和目录列表框
8.1.2 文件列表框
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1.2 文件列表框
文件列表框控件( FileListBox)用来显示指定目录中所包含的指定类型的文件,外观与列表框形似。
文件列表框属性
– Pattern属性
用来设置在运行时显示在 FileListBox控件中的文件类型。该属性可以在设计时用属性窗口设计,也可以运行时通过代码设置。在默认情况下,Pattern的属性值为 *.*,即所有文件。
– FileName属性
返回或设置所选文件的文件名。该属性只能在运行时通过代码设置,
不能在设计时用属性窗口设置。
– ListCount,ListIndex,List,MultiSelect属性
ListCount属性返回控件内所列项目的总和;
ListIndex属性返回或设置控件上所选择的项目的“索引值”(即下标);
List属性中存有文件列表框中所有项目的数组,可用来返回或设置某一项目;
MultiSelect属性返回或设置一个值,该值指示是否能够在 FileListBox
控件中进行复选以及如何进行复选。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1.2 文件列表框
文件列表框事件
– 文件列表框最常用的事件是 Click事件和
DblClick事件。利用 DblClick事件,可以执行文件列表框中的某个可执行文件。也就是说,只要双击文件列表框中的某个可执行文件,就能执行该文件。通过 Shell函数来实现。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.1.2 文件列表框
【 例 8-1】 图形浏览器的设计 。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 8章 文 件
8.1 文件系统控件
8.2 文件及其基本操作
8.3 文件的分类及其应用
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2 文件及其基本操作
8.2.1 文件与文件结构
8.2.2 文件的基本操作
8.2.3 目录及文件操作
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.1 文件与文件结构
文件结构
– 为了能有效地存取数据,数据必须以某种特定的方式存储,这种特定的方式称为文件结构。 Visual Basic文件由记录组成,记录由字段组成,字段由字符组成。
– 字符( Character)
是构成文件的最基本单位。字符既可以是字母、数字等 ASCII码字符,
也可以是汉字。
– 字段( Field)
由若干字符组成的一项数据。例如,学号,95001”就是一个字段,而姓名“张三”也是一个字段。
– 记录 ( Record)
由一组相关字段组成。例如,一个学生记录可以由学号、姓名、性别等字段组成。若干个记录的集合就组成了文件。
– 文件 ( File)
由记录构成,一个文件含有一个以上记录。例如,在学生文件中有
100人的信息,每个人的信息是一个记录,100个记录构成一个文件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.1 文件与文件结构
在 Visual Basic中根据文件结构和访问方式,
将文件分为三类:
– 顺序存取文件
– 随机存取文件
– 二进制存取文件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.1 文件与文件结构
文件的分类
– 根据不同的标准,文件可以分为不同的类型。
– ( 1)根据文件存储数据的性质可以分为程序文件和数据文件
程序文件( Program file)存储的是可以由计算机执行的程序,包括源文件和可执行文件等,在 Visual
Basic中的窗体文件、模块文件、类文件和工程文件等都是程序文件。
数据文件( Data file)存储的是各种数据。例如学生信息、职工工资等。这类数据必须通过程序存取和管理。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.1 文件与文件结构
文件的分类
– 根据文件的存取方式和结构分为顺序文件和随机文件
顺序文件( Sequential file)的结构比较简单,文件中的记录一个接一个的顺序存放。在这种文件中要读取某个数据,必须从文件头开始,一个记录一个记录地顺序读取。
– 顺序文件的组织比较简单,占用空间少、容易使用,但维护困难,
不能灵活地存取和增减数据。要修改文件中的某个记录,必须把整个文件读入内存,修改完后再重新写入磁盘。因此,顺序文件适用于有一定规律且不经常修改的数据存储。
随机文件( Random file)又称直接存取文件,可以不必考虑记录的位置,根据需要直接访问文件中的任意记录。在随机文件中,每个记录的长度都是固定的,记录中字段的长度也是固定的,每个记录都有一个记录号。可以根据记录号,直接存取 随机文件中的记录。
– 随机文件具有存取灵活、易于修改、访问速度快等优点。但占用空间比较大,组织结构比较复杂。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.1 文件与文件结构
文件的分类
– 根据文件中数据的编码方式可以分为 ASCII码文件和二进制文件
ASCII码文件又称文本文件,文件中的数据都是以
ASCII码字符的方式存储的,这种文件可以用普通的字处理软件打开编辑(以纯文本文件方式保存)。
二进制文件是指文件的数据以二进制的方式存储,
占用空间较小。但二进制文件不能用普通的字处理软件进行编辑。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2 文件及其基本操作
8.2.1 文件与文件结构
8.2.2 文件的基本操作
8.2.3 目录及文件操作
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
在 Visual Basic中,数据文件的操作按以下步骤进行。
– 打开(或建立)文件。一个文件必须先打开或建立后才能使用。
如果一个文件已经存在,则打开该文件;如果不存在,则建立该文件。文件打开后都有相应的文件号与之相关。文件号是一个整数,可以看作是文件的代表。在文件读写时都要指定文件号。
– 对文件进行处理。根据用户的需要,在打开或建立的文件上执行所要求的输入输出操作。在文件处理中,把内存中的数据传输到相关的设备上(如磁盘)并作为文件存放的操作叫做写数据。而把数据文件中的数据传输到内存中的操作,叫做读数据。
– 关闭文件。将数据写入文件,并释放相关的资源。
在 Visual Basic中,数据文件的操作通过操作语句和函数来实现。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的打开
– 对文件进行操作之前,必须先打开或建立文件。 Visual
Basic用 Open语句打开或建立一个文件,其格式为:
Open 文件名 [For方式 ][Access存取类型 ][Lock] As [#]文件号 [Len=记录长度 ]
– Open语句的功能是:为文件的输入输出分配缓冲区,
确定缓冲区所使用的存取方式。
– 说明:
( 1)格式中的 Open,For,Access,As以及 Len为关键字;
文件名指要打开文件的名称,包括文件的路径。当前目录(文件夹)下,可以只有文件名。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的打开
– ( 2) For方式,指定文件输入输出方式,共有以下 5种方式,缺省为 Random。
Input:以输入方式打开顺序文件,文件指针定位在文件开头,
只能读取文件。
Output:以输出方式打开顺序文件,文件指针定位在文件开头,只能向文件写入内容。如果打开的文件中已有内容,则覆盖原有内容(相当于打开了一个空文件)。
Append:以输出方式打开顺序文件,文件指针定位在文件尾,
只能向文件写入内容。与 Output不同的是,如果打开的文件中已有内容,并不覆盖原有内容,而是从文件的尾部开始继续写入数据,即追加文件内容。
Binary:以二进制方式打开文件。
Random:以随机方式打开文件,这是缺省的操作方式,即当
For关键字省略时,文件以随机方式打开。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的打开
– 用 Open语句可以打开或建立一个文件。用
Open语句打开文件时,如果指定的文件不存在,以 Input方式打开时将会出现错误,而以
Output,Append,Binary和 Random方式打开时将建立相应的文件。在 Binary,Input和
Random方式下,可以用不同的文件号打开同一文件,而不必先将该文件关闭。而在
Append和 Output方式下,如果要用不同的文件号打开同一文件,则必须在打开文件之前先关闭该文件,
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的打开
– 说明:
( 3) Access 存取类型,用来指定存取文件的类型。
有以下 3种方式:
– Read:以只读方式打开文件。
– Write:以只写方式打开文件。
– Write/Read:以读 /写方式打开文件(允许读也允许写),
这是缺省的方式。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的打开
– 说明:
( 4) Lock锁定,用于在多用户或多进程环境中限制其他用户或进程对打开文件的操作。锁定的类型有以下 4种:
– Lock Shared:任何用户或进程都可以读写该文件。
– Lock Read:不允许其他用户或进程读该文件。
– Lock Write:不允许其他用户或进程写该文件。
– Lock Write/Read:不允许其他用户或进程读写该文件,
这是锁定的缺省值。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的打开
– 说明:
( 5)文件号,用来标识打开文件的文件句柄,是一个整数表达式,其值在 1~ 511之间的范围内。对打开文件的读写操作都要使用文件号。
( 6)记录长度,是一个整型表达式。对于随机文件,该值是记录长度;对于顺序文件,该值是缓冲字符数;对于二进制文件,将忽略 Len子句。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的关闭
– 文件的读写操作结束后,应将文件关闭。可以通过
Close语句来实现。其语法格式为:
Close [[ # ]文件号 ] [,[ # ]文件号 ]……
– Close语句用来结束文件的输入输出操作。
– 说明:
Close语句用来关闭文件,是打开文件以后的操作。文件号是用 Open语句打开文件时,给文件分配的文件号。关闭一个数据文件具有两方面的作用,一是把文件缓冲区的所有数据写到文件中,二是释放与该文件相关的文件号,供其他 Open语句使用。
Close可以关闭多个文件,如果指定了文件号,则把指定的文件关闭;如果省略所有的文件号,则关闭打开的所有文件。
除了用 Close语句关闭文件外,在程序结束时,系统将自动关闭所有打开的数据文件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的读写
– 文件的主要操作是读和写,文件的读写过程中使用了许多语句和函数,这儿先介绍这些语句和函数的使用,
文件的读写操作将在后面各节介绍。
– FreeFile函数
使用 FreeFile函数可得到一个在程序中没有使用的文件号,该函数返回一个整型数据。当在程序中打开多个文件时非常有用,
可以避免出现相同的文件号。该函数语法格式如下:
FreeFile[(范围 )]
参数“范围”是可选参数,用来决定返回的文件号的取值范围。
缺省值为 0,当参数为 0时,则返回一个介于 1~ 255之间的文件号。为 1时,则返回一个介于 256~ 511之间的文件号。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的读写
– Loc函数
Loc函数返回由“文件号”指定的指定文件的当前读写位置。是一个长整型值其语法格式如下:
Loc(文件号 )
Loc函数对于随机文件,返回上一次读取或写入的记录号;对于二进制文件,返回上一次读取或写入的字节位置;对于顺序文件,返回的是该文件打开以来读或写的记录个数,一个记录是一个数据块。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的读写
– LOF函数
LOF函数返回一个长整型值,表示用 Open语句打开的文件的大小,该大小以字节为单位。其语法格式如下:
LOF(文件号 )
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的读写
– Lock和 Unlock语句
在多用户或多进程环境中,可以用 Lock和 Unlock语句限制其他用户或进程对打开的全部文件或部分文件的访问控制。在使用
Lock和 Unlock语句时,这两个语句总是成对出现。其语法格式为:
Lock[ # ] 文件号 [,记录 |[开始 ] To 结束 ]
Unlock[ # ] 文件号 [,记录 |[开始 ] To 结束 ]
对于不同类型的文件,“记录”、“开始”、“结束”的含义不一样。对于二进制文件,它们代表从文件开头起算的字节号,
文件的第一个字节的字节号是 1;对于随机文件,它们代表文件开头起算的记录号,文件的第一个记录的记录号是 1。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的读写
– FileAttr函数
FileAttr函数用于返回打开文件的信息。其语法格式如下:
FileAttr(文件号 [,返回值类型 ])
返回值类型是可选参数,只能取两个值 1(缺省值)
和 2。当该属性值为 1(或缺省)时,返回打开文件的方式。当该属性值为 2时,返回打开文件的句柄。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.2 文件的基本操作
文件的读写
– EOF函数
EOF函数用于测试文件的结束标志,可以避免因试图在文件结尾处进行输入而产生的错误。其语法格式如下:
EOF(文件号 )
对于用 Input方式打开的顺序文件,如果已经读到文件尾,则返回 True,否则返回 False。对于以 Output,Append打开的顺序文件,EOF函数总返回 True。
对于随机文件,如果最后执行的 Get(读数据)语句未能读出完整的记录时,EOF函数返回 True,否则返回 False。
EOF函数通常用来在循环读数据时测试是否已到文件尾,
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2 文件及其基本操作
8.2.1 文件与文件结构
8.2.2 文件的基本操作
8.2.3 目录及文件操作
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
文件及目录的基本操作
– 删除文件( Kill)
用 Kill语句来删除文件。其语法格式为:
Kill 文件名
– 拷贝文件( FileCopy)
用 FileCopy语句来拷贝文件。其语法格式为:
FileCopy 源文件名,目标文件名
源文件名和目标文件名都可以包含路径,但不能含有通配符。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
文件及目录的基本操作
– 文件(目录)重命名( Name)
可以用 Name语句来修改一个文件或目录的名称。
其语法格式为:
Name 原文件名 As 新文件名
原文件名和新文件名都可以包含路径,但不能含有通配符。
一般情况下,原文件和新文件都在同一个目录下。
如果原文件和新文件不在同一个目录下,则 Name
语句把原文件移动到新文件所在的目录,并更改文件名为新文件名。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
文件及目录的基本操作
– 建立目录( MkDir)
使用 MkDir语句建立目录。其语法格式为:
MkDir 目录名
– 删除目录( RmDir)
使用 RmDir语句删除目录。其语法格式为:
RmDir 目录名
删除目录时,所删除的目录应为空目录,即该目录下没有任何文件及子目录。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
文件及目录的基本操作
– 改变目录( ChDir)
使用 ChDir语句改变当前目录。其语法格式为:
ChDir 路径
ChDir可以改变当前目录,但不能改变当前驱动器。
– 改变驱动器( ChDriver)
使用 ChDriver语句改变当前驱动器。其语法格式为:
ChDriver [驱动器 ]
如果参数“驱动器”省略,则不会改变当前驱动器。
如果“驱动器”有多个字母,则以首字母为准。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
文件及目录的基本操作
– 获得当前目录( CurDir)
使用 CurDir语句可以确定任何一个驱动器的当前目录。其语法格式为:
CurDir [驱动器 ]
如果参数“驱动器”省略,则返回当前目录的驱动器。
– 获得文件及目录的属性( GetAttr)
使用 GetAttr语句获得文件及目录的属性。其语法格式为:
GetAttr 目录名
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
文件及目录的基本操作
– 可以用以下方式判断文件或目录的属性,如:
If ff And vbReadOnly Then Print "ReadOnly"
其中用 vbReadOnly 表示是否为只读。类似的判断值还有:
vbArchive 是否为归档文件
vbHidden 是否为隐藏文件
vbSystem 是否为系统文件
vbNomal 是否为普通文件
vbDirecory 是否为目录
– 另外,还可以用 FileLen函数来获得文件大小,用
FileDate函数获得文件建立时间
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
文件查找
– 文件查找在文件操作中相当常用,这儿介绍在一个目录中查找所有文件或某类文件的方法。使用查找的基本函数 Dir函数。其语法格式为:
Dir( 字符串 ) 及 Dir
– 其中,字符串是待查找的文件名,可以含有路径及通配符。 Dir(字符串 )用于首次查找,以后每次查找可以只使用 Dir而不带参数。 Dir函数的返回值代表每次查找得到的文件名。若返回值为空,则表示没找到。
– 由于找到的文件可能有多个,所有 Dir函数常用于循环中。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.2.3 目录及文件操作
【 例 8-2】 使用 Dir函数来查找文件。
– 本例中通过循环来找到多个文件,将找到的文件加入到一个列表框( List1)中,如图所示。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 8章 文 件
8.1 文件系统控件
8.2 文件及其基本操作
8.3 文件的分类及其应用
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3 文件的分类及其应用
8.3.1 顺序文件
8.3.2 随机文件
8.3.3 二进制文件
8.3.4 应用实例
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
顺序文件是按行存储的,记录的逻辑顺序和存储顺序是一致的。对顺序文件的读写操作只能一个记录一个记录地顺序进行。顺序文件的读写操作和标准输入输出十分相似。
顺序文件的写操作
– 数据文件的写操作分三步,即打开文件、写入文件和关闭文件。其中打开和关闭文件是由 Open和 Close语句完成的。
– 顺序文件的写操作可以用 Print #或 Write #语句来完成。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
顺序文件的写操作
– Print #语句
Print #语句的功能是把数据写入打开的文件中。其语法格式如下:
Print #文件号,[[Spc(n)|Tab[(n)]] [表达式 ] [;|,]]
说明:
– 和 Print方法相似,如果 Print #语句后面的“表达式”省略,则向文件中写入一个空行。如果 Print #语句最后一项参数后面没有以分号或逗号结束,则下次 Print #语句将把数据写到文件的下一行。
– 和 Print方法一样,Print #语句的各项参数直接可以用分号或逗号隔开,分别对于紧凑格式和标准格式。
– 为了能正确读取输出的文件,除了数值数据可以用 Print #语句写入到文件外,其他类型的数据尽量使用 Write #语句写入
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
【 例 8-3】 随机生成 100个 1~ 100间的正整数,并存入到文件,out.dat”中。
– 程序代码如下:
Private Sub Command1_Click()
Dim i As Integer,x As Integer
Randomize
Open "out.dat" For Output As #1
For i = 1 To 100
x = Int(Rnd * 100) + 1
Print #1,x;
Next
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
– Wrtie #语句
Wrtie #语句也是用来把数据写入到文件中。其语法格式为:
Write #文件号,表达式
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
– Write #语句和 Print #语句的功能类似,都是把数据写入到文件中。但是 Write #语句和 Print #语句有以下几点区别:
1) Write #语句没有 Spc函数和 Tab函数来控制输出位置。
2)表达式依然可以由多项组成,各项之间用逗号或分号分隔。
但在 Write #语句中,用逗号或分号分隔的效果是一样的。也就是说,逗号和分号只是一个各项间的分隔符。如果最后一项参数后面没有逗号或分号,那么下一个 Write #语句将从下一行写入数据,否则,下一个 Write #语句在本行继续输出。
3)用 Write #语句向文件写数据的时候,数据以紧凑格式存放。
但 Write #语句能自动在各项数据之间插入逗号,并给字符串数据两端加上双引号。
4)用 Write #语句写入的正数前面没有符号位,即空格。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
顺序文件的读操作
– 顺序文件的读操作可以由 Input #语句,Line Input #语句和 Input函数来完成。
– ( 1) Input #语句
Input #语句用于从文件中读取数据。其语法格式为:
Input #文件号,变量列表
– 说明:
1)“变量列表”可以由一个或多个变量组成,这些变量可以是不同的数据类型。与变量列表相对应,文件中数据项的类型应该和变量列表中变量的类型相同。如果变量为数值类型而数据不是数值类型,则指定变量的值为零。
2) Input #语句把读出的数据赋给数值型变量时,首先从文件中读取字符串,将忽略数值前面的空格、回车和换行符,从遇到的第一个非空格、回车和换行字符开始读取,遇到空格、回车、换行符或逗号则结束读取。然后相当于对读出的字符串运用 Val函数,从字符串中取出数值赋给变量。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
顺序文件的读操作
– 说明:
3) Input #语句把读出的数据赋给字符串变量时,同样忽略数值前的空格、回车和换行符,遇到回车、
换行或逗号结束读取。但如果有双引号把一串字符括起来,则读取双引号中所有的字符(包括逗号、
回车、换行),并赋给字符串变量。 Input #语句将忽略双引号。
4)读取文件时要注意文件的结尾,如果已经到达文件的结尾继续读数据的话,将产生错误。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
【 例 8-5】 读入例 8-4写入文件,out.dat”中的学号、
姓名、年龄,并打印到窗体上。
Private Sub Command1_Click()
Dim Age As Integer
Dim Name As String,Num As String
Open "c:\out.dat" For Input As #1
Print "学号 ","姓名 ","年龄 "
Do While Not EOF(1)
Input #1,Num,Name,Age
Print Num,Name,Age
Loop
Close #1
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
顺序文件的读操作
– Line Input #语句
Line Input #语句用于从文件中读取一个行,并把它赋给一个字符串变量。其语法格式为:
Line Input #文件号,字符串变量
Line Input #语句读取文件中一个完整行,赋给一个字符串变量。在文件操作中 Line Input #语句十分有用,它可以读顺序文件中一行的全部字符,遇到回车或换行结束读取,但回车和换行不会赋给字符串。
常用于文本文件的处理。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
顺序文件的读操作
– Input函数
Input函数用于从文件中读出 n个字符作为返回值返回。其语法格式为:
Input$(n,文件号 )
Input$函数从文件中读取 n个字符,即使遇到回车和换行也作为字符读出来,并赋值作为字符串返回。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
【 例 8-6】 在窗体上放置一个文本框(名称为
Text1,Multiline属性为 True,ScrollBars属性为 2)
和一个命令按钮(名称为 Cmd1,标题为,200-
400间素数”),单击按钮把 200到 400之间的所有素数显示在文本框中,并计算出所有素数的和,
把结果保存在,out.dat”文件中。
– 已经给出了一个标准模块 mode.bas,其中 putdata过程可以把结果存入指定文件。把标准模块 mode.bas添加到工程中,利用已经给出的 putdata过程存储计算结果
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
【 例 8-7】 单击“读取数据”按钮从文件
,in.txt”中读取 100个整数,存放在一个数组中(下界为 1),同时在文本框中显示这
100个数。单击“计算保存”按钮,计算前
20个数的和并保存到文件中。要求定义一个过程把计算结果保存到,result.txt”中。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.1 顺序文件
【 例 8-8】 单击“读取数据”按钮从文件
,in.txt”中读取 100个整数,存放在一个数组中(下界为 1)。单击“排序保存”按钮,
把数组中的 100个整数从大到小排序,并把排序后的整数显示在文本框中,然后把排序后的整数存储到文件,out.txt”中。要求定义一个过程把指定个数的数组元素存储到,out.txt”中。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3 文件的分类及其应用
8.3.1 顺序文件
8.3.2 随机文件
8.3.3 二进制文件
8.3.4 应用实例
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
可以随机存取的文件称为随机文件。在随机文件中,每个记录的长度是固定的。记录中每个字段的长度也是固定的。
在写入数据时,只要指定记录号,就可以把数据字节存入指定的位置。而在读取数据时,只要给出记录号,就能直接读取该记录。
随机文件可以不必考虑记录的位置,根据需要任意访问文件中的记录。在随机文件中,每个记录的长度都是固定的,
记录中字段的长度也是固定的,每个记录都有一个记录号。
可以根据记录号,直接存取随机文件中的记录。
随机文件以记录为单位进行操作,一般存储的记录都是以
Type…End Type 语句定义的记录型数据(即用户定义型数据)。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件的读写操作
– 随机文件的读写操作一般分为以下 4步:
用 Type…End Type 语句定义数据类型。
以随机方式打开文件。和顺序文件不同,打开随机文件后,可用于写操作,也可用于读操作。格式如下:
Open 文件名 [For Random] As 文件号 Len=记录长度
打开文件时,应注意给出记录长度(也就是用户定义数据类型占用的存储空间),如果省略,则记录的默认长度为 128;如果记录长度比要写入的记录的实际长度短,则会产生一个错误;
如果记录长度比要写入的记录的实际长度长,则可以写入记录,
只是会浪费一些磁盘空间。可以用 Len函数来得到用户定义数据类型的长度。
对文件进行读写操作。
关闭文件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件的读写操作
– 随机文件的读写操作一般分为以下 4步:
用 Type…End Type 语句定义数据类型。
以随机方式打开文件。和顺序文件不同,打开随机文件后,可用于写操作,也可用于读操作。格式如下:
Open 文件名 [For Random] As 文件号 Len=记录长度
打开文件时,应注意给出记录长度(也就是用户定义数据类型占用的存储空间),如果省略,则记录的默认长度为 128;如果记录长度比要写入的记录的实际长度短,则会产生一个错误;
如果记录长度比要写入的记录的实际长度长,则可以写入记录,
只是会浪费一些磁盘空间。可以用 Len函数来得到用户定义数据类型的长度。
对文件进行读写操作。
关闭文件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件的读写操作
– 随机文件的写操作
随机文件的写操作可以用 Put语句来实现。其语法格式如下:
Put #文件号,[记录号 ],变量
Put语句把变量存储到文件的指定记录。记录号可以省略,如果省略记录号,则在上一个 Get或 Put语句之后(或上一个 Seek函数指出的)的下一个记录写入。省略记录号时,用于分界的逗号都必须罗列出来,
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件的读写操作
– 【 例 8-9】 用 Type…End Type 语句定义一个记录数据类型,用来存储每个学生的学号、姓名、
年龄。输入 3个学生的记录,并存储到文件中。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件的读写操作
– 随机文件的读操作
随机文件的读操作可以用 Get语句来实现。其语法格式如下:
Get #文件号,[记录号 ],变量
Get语句从文件中读取指定记录,并存入相应变量中,
和 Put语句相同,记录号可以省略,如果省略记录号,
则在上一个 Get或 Put语句之后(或上一个 Seek函数指出的)的下一个记录读入。省略记录号时,用于分界的逗号都必须罗列出来。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件的读写操作
– 【 例 8-10】 读出例 8-9写入的学生记录,并存储到数组中,然后打印到窗口上 。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件中记录的增加与删除
– 增加记录
在随机文件中增加记录,就是在文件的末尾添加记录。首先找到文件最后一个记录的记录号,然后把要增加的记录写在它的后面。
– 【 例 8-11】 在例 8-9写入的学生记录后添加一个新记录。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
随机文件中记录的增加与删除
– 删除记录
通过清除其字段可以删除一个记录,但是该记录仍在文件中存在。通常文件中不能有空记录,因为它们会浪费空间且会干扰顺序操作。最好把余下的记录拷贝到一个新文件,然后删除旧文件。
要清除随机访问文件中删除的记录,一般按如下步骤执行:
– 1)创建一个新文件。
– 2)把所有有用的记录从原文件复制到新文件。
– 3)关闭原文件并用 Kill 语句删除它。
– 4)使用 Name 语句把新文件以原文件的名字重新命名。
【 例 8-12】 删除文件中第 n个学生记录
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
用控件显示和修改随机文件
– 所谓用控件显示和修改随机文件,就是利用控件来显示随机文件的内容,并提供修改功能,
使用户一目了然。下面用一个具体的例子来介绍如何使用控件显示和修改随机文件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.2 随机文件
用控件显示和修改随机文件
– 【 例 8-13】 建立如图 8.7所示的界面来显示和修改记录。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3 文件的分类及其应用
8.3.1 顺序文件
8.3.2 随机文件
8.3.3 二进制文件
8.3.4 应用实例
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.3 二进制文件
利用二进制可以存取任意文件的原始字节,即不仅能获取 ASCII文件,而且能读取和修改非 ASCII
格式存储的文件。例如图像文件等。
通过使用二进制访问可以使磁盘空间的使用降到最小。二进制存取方式与随机存取方式一样,使用 Get#语句和 Put#语句进行读写操作。
使用 Open语句可以打开二进制输入输出文件,语法格式如下:
Open 文件名 [For Binary] As #文件号
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.3 二进制文件
二进制存取与随机存取
– 二进制文件与随机文件的存取操作类似,这主要表现在:
– ( 1)不需要在读和写之间切换。在执行 Open语句打开文件后,
对该文件既可以读,也可以写,并且利用二进制存取可以在一个打开的文件中前后移动。
– ( 2)读写随机文件的语句可以用于读写二进制文件,即:
Get | Put #文件号,[位置 ],变量
– 在这里“变量”可以是任何类型,包括变长字符串和记录类型;
“位置”指明下一个 Get或 Put操作在文件的什么地方进行。二进制文件的“位置”相对于文件开头而言。即第一个字节的“位置”
是一,第二个字节的“位置”是二等等。如果省略“位置”,则
Get和 Put操作将文件指针从第一个字节到最后一个字节顺序进行扫描。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.3 二进制文件
二进制存取与随机存取
– Get语句从文件中读出的字节数等于“变量”的长度。同样,Put
语句向文件中写入的字节数与“变量”的长度相同。例如,如果变量为整型,Get#语句把读取的 2个字节赋给变量,如果变量为单精度型,Get就读取 4个字节。如果 Get和 Put语句没有指定“位置”,则文件指针每次移过一个与“变量”长度相同的距离。
– 二进制文件和随机文件也有不同之处,主要是:二进制存取可以移到文件的任一字节的位置上,然后根据需要读、写任意多个字节;而随机存取每次只能移到一个记录的边界上,读取固定个数的字节(一个记录的长度)。
– 二进制文件只能通过 Get语句或 Input$函数读取数据,而 Put则是向以二进制方式打开的文件中写入数据的唯一方法。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.3 二进制文件
文件指针
– 文件打开后,自动生成一个指针(隐含的),文件的读写就从这个指针所指的位置开始。用 Append方式打开文件后,文件的指针指向文件的末尾,而如果用其他几种方式打开文件,则文件指针都指向文件开头。
完成一次读写操作后,文件指针自动移到下一个读写操作的开始位置,移动量由 Open语句和读写语句的相关参数共同决定。对于随机文件,其指针最小移动单位是一个记录的长度;而顺序文件中文件指针移动的长度与它读写的字符串的长度相同。二进制文件中可以把文件指针移到文件中的任意位置。
– 文件指针的定位通过 Seek语句。 Seek语句设置下一个读 /写操作的位置,语法格式为:
Seek [#]文件号,位置
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.3 二进制文件
文件指针
– 说明:
– ( 1)对于用 Binary,Input,Output或 Append方式打开的文件,“位置”是从文件开头到“位置”为止的字节数,即执行下一个操作的地址。对于用 Random方式打开的文件来说,“位置”是指记录号。
– ( 2) Get和 Put语句中的记录号优先于由 Seek语句确定的位置。当“位置”为零或负数时,将产生出错信息
“错误的记录号”。当 Seek语句的“位置”在文件位置后时,对文件的写操作将扩展该文件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.3 二进制文件
文件指针
– 说明:
与 Seek语句配合使用的是 Seek函数,其语法格式如下:
Seek(文件号 )
Seek函数返回当前的读 /写位置,即文件指针的位置,
返回值的类型是长整型。对于用 Binary,Input、
Output或 Append方式打开的文件,返回文件中的字节位置(产生下一操作的位置)。对于用 Random
方式打开的文件,返回的是一个要读或写的记录号。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.3 二进制文件
文件指针
– 在访问二进制文件时,Seek函数与 Loc函数给出相似的结果。所不同的是 Loc函数返回的是最近一次读写过的字节的位置,而 Seek函数返回的是下一次要读写的位置。
– 对于顺序文件,Seek语句把文件指针移到指定的字节位置上,Seek函数返回有关下一次将要读写的位置信息;对于随机文件,Seek语句只能把文件指针移到一个记录的开头,而 Seek函数返回的则是下一个记录号。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3 文件的分类及其应用
8.3.1 顺序文件
8.3.2 随机文件
8.3.3 二进制文件
8.3.4 应用实例
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.4 应用实例
【 例 8-14】 设置一个阅读器,用以显示指定的文本文件,并把阅读器中的文件另存为其他文件,或修改内容后重新存盘。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
8.3.4 应用实例
【 例 8-15】 将某班学生考试成绩输入到
“考试成绩”随机文件中。每个学生的记录包含学号、姓名、高等数学成绩、英语成绩和计算机基础成绩五个字段,
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社学完本章你应能够:
掌握文件系统控件的使用;
了解数据文件的概念及分类;
了解与文件使用有关的函数和语句;
理解顺序文件、随机文件等的特点;
掌握顺序文件的建立,数据的读写操作及相关程序设计;
掌握随机文件的建立,数据的读写操作及相关程序设计。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社思 考 题
1.文件的作用是什么? 目录和文件是什么关系?
2,在 Visual Basic中文件操作的一般步骤是什么?
3,随机文件与顺序文件的读写有什么区别?通过什么语句实现?
4,用 Output或 Append两种方式打开顺序文件的区别是什么?
5,二进制文件与随机文件有什么差别?
6,在随机文件文件中增加记录或删除记录的主要操作过程是什么?