第 9章 文件本章我们讨论的主要是数据文件 。 数据文件存储的是程序运行时所用到的数据 。 在实际应用中,经常涉及到需要重复使用的大量数据,在这种情况下,如果每次都从键盘上输入,一方面造成大量的人力,物力浪费,另一方面又增大了输入出错的可能性 。 解决这种问题的常用方法是,把待输入的大量数据预先准确无误地以文件的形式存储到磁盘上,需要用到数据时,从文件中读出即可 。 同样,我们也可把程序的运行结果存到磁盘上,这样既能长期保存数据,又能做到数据共享 。
退出在 VB中,按照文件的存取访问方式,分为顺序文件、随机文件、二进制文件。应用程序访问一个文件时,应根据文件包含什么类型的数据,确定合适的访问类型。 VB为用户提供了多种处理文件的方法,具有较强的文件处理能力。
9.1 文件操作流程
9.2 顺序文件
9.3 随机文件
9.4 二进制文件
9.5 文件操作常用函数
9.1 文件操作流程在 VB中,对于顺序文件,随机文件,二进制文件的操作通常都有 3个步骤:
( 1) 打开文件
( 2) 访问文件
( 3) 关闭文件本节仅对以上 3个步骤作概念上的说明,具体的语句格式及使用在后续小节中介绍 。
9.1.1 打开文件文件操作的第一步是打开文件。在创建新文件或使用旧文件之前,必须先打开文件。打开文件的操作,
会为这个文件在内存中准备一个读写时使用的缓冲区,
并且声明文件在什么地方,叫什么名字,文件的处理方式。
9.1.2 访问文件访问文件是文件操作的第二步。所谓访问文件,
即对文件进行读 /写操作。从磁盘将数据送到内存称为
“读”,从内存将数据存到磁盘称为“写”。
9.1.3 关闭文件打开的文件使用(读 /写)完后,必须关闭,否则会造成数据丢失。关闭文件会把文件缓冲区中的数据全部写入磁盘,释放掉该文件缓冲区占用的内存。
9.2 顺序文件顺序文件用于处理一般的文本文件,它是标准的
ASCII文件。顺序文件中各数据的写入顺序、在文件中的存放顺序、和从文件中的读出顺序 3者是一致的。
顺序文件按行组织信息 。 每行由若干项组成,行的长度不固定,每行由回车换行符号结束 。
9.2.1 顺序文件的打开与关闭在对顺序文件进行操作之前,必须用 Open语句打开要操作的文件。在对一个文件操作完成后,要用
Close语句将它关闭。
1,Open语句的一般格式
Open 文件名 [For打开方式 ] As [#]文件号
( 1)文件名。
( 2)打开方式包括以下 3种。
Input Output Append
( 3) 文件号 。 是一个 1~ 511之间的整数 。 它用来代表所打开的文件,文件号可以是整数或数值型变量 。
例如:
① Open "d,\shu1.dat" For Input As #1
该语句以输入方式打开文件 shu1.dat,并指定文件号为 1。
② Open "d,\shu2.dat" For Output As #5
该语句以输出方式打开文件 shu2.dat,即向文件
shu2.dat进行写操作,并指定文件号为 5。
③ Open "d,\shu3.dat" For Append As #7
该语句以添加方式打开文件 shu3.dat,即向文件
shu3.dat添加数据,并指定文件号为 7。
2,Close语句的一般格式
Close [文件号表列 ]
例如:
① Close #1
关闭文件号为 1的文件 。
② Close #2,#7,#8
关闭文件号为 2,7,8的文件 。
③ Close
关闭所有已打开的文件 。
9.2.2 顺序文件的写操作
VB用 Print语句或 Write语句向顺序文件写入数据 。
创建一个新的顺序文件或向一个已存在的顺序文件中添加数据,都是通过写操作实现的 。 另外,顺序文件也可由文本编辑器 ( 记事本,Word等 ) 创建 。
1,Print语句
Print语句的一般格式:
Print #文件号 [,输出表列 ]
例如:
Open "d,\shu2.dat" For Output As #2
Print # 2,"zhang"; "wang"; "li"
Print # 2,78; 99; 67
Close #2
执行上面的程序段后,写入到文件中的数据如下:
zhangwangli
78 99 67
2,Write语句用 Write语句项文件写入数据时,与 Print语句不同的是,Write语句能自动在各数据项之间插入逗号,并给各字符串加上双引号 。
Write语句的一般格式:
Write #文件号 [,输出表列 ]
例如:
Open "d,\shua.dat" For Output As #6
Write # 6,"zhang"; "wang"; "li"
Write # 6,78; 99; 67
Close #6
执行上面的程序段后,写入到文件中的数据如下:
"zhang","wang","li"
78,99,67
9.2.3 顺序文件的读操作顺序文件的读操作,就是从已存在的顺序文件中读取数据 。 在读一个顺序文件时,首先要用 Input方式将准备读的文件打开 。 VB提供了 Input,Line Input语句和 Input函数将顺序文件的内容读入 。 Input函数将在 9.4节中介绍 。
1,Input语句
Input语句一般格式:
Input #文件号,变量表列例如:
Private Sub form_Click( )
Dim x$,y$,z$,a%,b%,c%
Open "c,\_vb\shua.dat" For Input As #1
Input #1,x,y,z
Input #1,a,b,c
Print x,y,z
Print a,b,c
Print a + b + c
Close #1
End Sub
如果顺序文件 shua.dat的内容如下:
"zhang","wang","li"
78,99,67
执行 Form_Click过程,在窗体上显示的内容为:
zhang wang li
78 99 67
244
2,Line Input语句
Line Input语句是从打开的顺序文件中读取一行。
Line Input语句的一般格式:
Line Input #文件号,字符串变量例如:如果顺序文件 shua.dat的内容如下:
"zhang","wang","li"
78,99,67
我们用 Line Input语句将数据读出并且把它显示在文本框中 。
Private Sub Command1_Click()
Dim a$,b$
Open "c,\_vb\shua.dat" For Input As #2
Line Input #2,a
Line Input #2,b
Text1.Text = a & b
End Sub
执行以上过程,文本框中显示的内容为:
"zhang","wang","li"78,99,67
9.3 随机文件使用顺序文件有一个很大的缺点,就是它必须顺序访问,即使明知所要的数据是在文件的末端,也要把前面的数据全部读完才能取得该数据 。 而随机文件则可直接快速访问文件中的任意一条记录,它的缺点是占用空间较大 。
随机文件由固定长度的记录组成,一条记录包含一个或多个字段 。 具有一个字段的记录对应于任一标准类型,比如整数或者定长字符串 。 具有多个字段的记录对应于用户定义类型 。 随机文件中每个记录都有一个记录号,只要指出记录号,就可以对该文件进行读写 。
9.3.1 随机文件的打开与关闭在对一个随机文件操作之前,也必须用 Open语句打开文件,随机文件的打开方式必须是 Random方式,
同时要指明记录的长度。与顺序文件不同的是,随机文件打开后,可同时进行写入与读出操作。
Open语句的一般格式:
Open 文件名 For Random As #文件号 Len=记录长度说明:
记录长度是一条记录所占的字节数。可以用 Len函数获得。
例如,定义以下记录:
Type student
Name As String*10
Age As Integer
End Type
就可以用下面的语句打开:
Open "d,\Test.dat" For Random As #9 Len=Len
( student)
随机文件的关闭同顺序文件一样,用 Close 语句。
9.3.2 随机文件的写操作用 Put语句进行随机文件的写操作。
Put语句一般格式为:
Put # 文件号,记录号,变量说明:
Put语句把变量的内容写入文件中指定的记录位置。
记录号是一个大于或等于 1的整数。
例如,Put # 1,9,t
表示将变量 t的内容送到 1号文件中的第 9号记录去。
9.3.3 随机文件的读操作用 Get语句进行随机文件的读操作 。
Get语句格式一般为:
Get # 文件号,记录号,变量说明:
Get语句把文件中由记录号指定的记录内容读入到指定的变量中 。
例如,Get # 2,3,u
表示将 2号文件中的第 3条记录读出后存放到变量 u
中 。
9.4 二进制文件二进制文件被看作是字节顺序排列的 。 由于对二进制文件的读写是以字节为单位进行的,所以能对文件进行完全的控制 。 如果知道文件中数据的组织结构,
则任何文件都可以当作二进制文件来处理使用 。
9.4.1 二进制文件的打开与关闭二进制文件的打开用 Open语句。其格式为:
Open 文件名 For Binary As #文件号使用 Close语句关闭二进制文件。
9.4.2 二进制文件的读 /写操作对二进制文件的读 /写同随机文件一样用 Put和 Get
语句。它们的格式如下:
Put # 文件号,位置,变量
Get # 文件号,位置,变量
9.5 文件操作常用函数
1,LOF函数格式,LOF( 文件号 )
功能:返回一个已打开文件的大小,类型为 Long,
单位是字节 。
2,FileLen函数格式,FileLen( 文件名 )
功能:返回一个未打开文件的大小,类型为 long,
单位是字节 。 文件名可以包含驱动器以及目录 。
3,EOF函数格式,EOF( 文件号 )
功能:用于判断读取的位置是否已到达文件尾 。
当读到文件尾时,返回 True,否则返回 False。 对于顺序文件,用 EOF 函数测试是否到达文件尾;对于随机文件和二进制文件,如果读不到最后一个记录的全部数据,返回 True,否则返回 False。 对于以 Output 方式打开的文件,EOF 函数总是返回 True。
4,LOC函数格式,LOC( 文件号 )
功能:返回文件当前读 /写的位置,类型为 Long。
对于随机文件,返回最近读 /写的记录号;对于二进制文件,返回最近读 /写的字节的位置 。 对于顺序文件,
返回文件中当前字节位置除以 128 的值 。 对于顺序文件而言,Loc的返回值无实际意义 。
5,Input函数格式,Input(字符数,#文件号)
功能:从打开的顺序文件读取指定数量的字符。
Input函数返回从文件中读出的所有字符,包括逗号、
回车符、换行符、引号和空格等。
例如,Text1.Text=Input( Lof( 2),#2)
该语句是将 2号文件的内容全部复制到文本框中。