6.2 文件存取操作

本节主要内容:6.2.1文件的顺序存取   6.2.2文件的随机存取  6.2.3文件的二进制存取

 

计算机用内存暂存数据,而用磁盘等外部存储器长久地保存数据。计算机一般采用文件形式保存数据。根据计算机访问文件的方式,又可将文件分为三种类型:

( 1 )顺序文件 是普通的正文文件,读写顺序文件时,每次读写一行,每行的长度可以根据需要变化。适用于读写连续块中的文本文件。

( 2 )随机文件 是可以按任意顺序读写的文件(随机读写)。每一行(每一个记录)的长度必须相同。适用于读写有固定长度记录结构的文本文件或者二进制文件。

( 3 )二进制文件 是字节的集合,数据不按某种特定的方式进行组织,允许按所需的任何方式组织和访问。这类文件的灵活性最大,但程序设计时的工作量和难度也最大。

同其它传统开发语言一样, Visual Basic 也提供了对各类文件进行处理和访问的语句,利用这些语句,可实现对各类文件的创建和存取等操作。这里主要介绍 Visual Basic 对文件创建、存取操作的基本方法。

Visual Basic 的文件处理主要包括:

①打开或建立文件 文件必须先打开或建立后才能使用。操作时,如果指定的文件已存

在,则打开文件;如果指定的文件不存在,则建立文件。

②文件的读写操作 在打开(或建立)的文件上执行所要求的输人输出操作。其中,把数据传输到外部设备(如磁盘)并作为文件存放的操作称为写数据;把数据文件中的数据传输到内存中的操作称为读数据。一般来说,在内存与外设的数据传输中,由内存传输到外设称为输出或写操作,而由外设传输到内存称为输人或读操作。

③关闭文件 文件操作完成后,应及时关闭文件,保证文件数据的安全及后续操作,以防止数据丢失。

6 . 2 . 1 文件的顺序存取 (返回)

•  顺序文件的打开与关闭

( 1 )顺序文件的打开语句

语句格式:

Open 文件名 For 存取方式 [Access 操作类型 ][ 加锁类型 ]As [ # ] 文件通道号

功能:打开或创建指定的文件,并为文件的输人输出分配缓冲区,同时指定缓冲区所使用的文件存取方式。若指定的文件不存在,则创建该文件。

说明:

① 文件名:用于指定要打开或创建的文件,可包含盘符和路径。

② 存取方式:用于指定文件的存取方式。其取值与含义如表 6 . 4 所示。

表 6 . 4 存取方式取值与含义

存取方式

说明

Input

将数据从文件输入到内存,即对文件的读操作。

Output

将数据从内存输出到文件,即对文件的写操作。

Append

将文件追加到文件末尾,即以追加的方式写文件。

③ Access 操作类型:用于指定访问文件的类型。其取值为以下类型之一:

Read 以只读方式打开文件

Write 以只写方式打开文件

ReadWrite 以可读可写方式打开文件。该类型仅用于随机文件和二进制文件。顺 序文件一般使用的是 Read 或 Write 。

④ 加锁类型:主要用于多用户或多进程环境中,用于限制其他用户或其他进程对已打开文件所进行的读写操作。其加锁类型有:

Lock Read 文件打开时,无权对该文件进行读操作。

Lock Write 文件打开时,无权对该文件进行写操作。

Lock Read write 文件打开时 , 无权对该文件进行读写操作。

Shared 共享,可对当前打开的文件进行读写操作。

⑤ 文件通道号:表示打开或创建文件时所使用的通道号,为一整型值,其取值可为 l - 511 。利用 FreeFile 函数可自动获得下一个未被使用的通道号。该函数的使用方法为:

Dim Fileno AS Integer

Fileno = FreeFile

通道号前面的“#”为可选项。

例如:若要在 C :\ xy 目录下创建一个名为 File1 . txt 的文本文件,则以写的方式打开文件的语句为:

Dim Fileno As Integer

Fileno = FreeFile

Open “C:\xy\File1.txt” For Output As # Fileno”

若要打开并读取 C :\ xy 目录下的 File1 . txt 文件的内容,则以读的方式打开语句为:

Dim Fileno As Integer

Fileno = FreeFile

Open “C:\xy\File1.txt” For Input As # Fileno”

若要打开并读取 C :\ xy 目录下的 File1 . txt 文件内容,且不允许其他用户对它进行修改操作,则相应的打开语句应为:

Dim Fileno As Integer

Fileno = FreeFile

Open “C:\xy\File1.txt” For Input Lock Write As # Fileno”

若在该文件打开时,禁止其他用户再打开该文件,则实现的语句应为:

Open “C:\xy\File1.txt” For Input Lock Read As # Fileno”

(2) 文件的关闭

在 VB 中,无论采用哪种方式打开文件,关闭文件的方法均一样,实现关闭操作的语句为 Close 。

格式: Close [[ # ] 通道号 1][ , [ # ] 通道号 2] …

功能:将指定通道号上的文件关闭。该语句可同时关闭多个文件。

例如:

关闭 1 号通道上所打开的文件,则语句为:

Close # l 或 Close 1

关闭 1 、 4 通道上所打开的文件,则语句为:

Close # l ,# 4 或 Close 1 , 4

关闭所有已打开的文件,则语句为:

Close

2 . 顺序文件的读写操作

( 1 )顺序文件的写操作

实现顺序文件写操作的语句有 Write 语句和 Print 语句。

Write 语句格式:

Write #通道号 [ ,输出数据列表 ]

语句功能:将输出数据列表所指定的数据顺序写人到通道号指定的文件中。各列表项间可用逗号或分号进行分隔。

Wrl ie 语句在写人数据时,会自动在各数据项间插入分隔符逗号,并且在语句的输出数据列表写人完毕后,会自动换行,即一个 Write 语句的数据均输出在一行上。

Write 语句若缺省输出数据列表参数,则用于向文件中写人一空行,此时通道号后的逗号不能省略。

另外,用 Wite 语句向文件中写人数据时,系统会自动遵循以下约定,以便在用 Input 语句读数据时,能正确识别各自的数据类型。

①对于逻辑型数据,在写人文件时,均保存为# True #或# False #的形式。

②对于日期型数据,均采用# yyyy - mm - dd hh : mm : ss #的形式保存。另外,日期和时间部分可分开保存,此时各自的表达形式为# yyyy - mm - dd #和# hh : mm : ss #。

③字符型数据将用双引号引起来。

 

Print 语句格式:

Print #文件通道号, [[Spc ( n ) |Tab ( n ) ][ 表达式列表 ][ ; | , ]]

语句功能:以打印的方式向通道号所代表的文件写人表达式列表所指定的数据。

与 Write 语句不同的是,该语句向文件写人数据时,不会对数据项增加分界符,适合于对文本数据的写人或保存,被写人的数据以后主要是用于显示或打印。 Write 语句适合对需要区分数据类型的数据文件进行写人操作,或在数据写人文件后,还需再次用程序读出进行处理的情况。

说明:表达式列表可以是数值型或字符型的数据,各表达式间用逗号或分号进行分隔。若用分号分隔,则数据项采用紧凑格式写人,即数据项之间无分隔符;若用逗号分隔,则每个数据项将占用一个打印区,每个打印区为 14 个字符宽。

若 Print 语句的表达式列表的最后无逗号或分号,则写人完毕后将自动回车换行。

若缺省表达式列表,则向文件写入一个行。

可选项函数 Spc ( n )和 Tab ( n )用于在各数据项间插人若干空格,以便让数据项分隔开来。下面对这两个函数作一简单的介绍:

① SpC ( n )函数:产生 n 个空格。

② Tab ( n )函数:表示下一个数据项将在第 n 列位置写人或输出,要写人或输出的数据项放在 Tab ( n )函数之后,彼此间用分号分隔。

两个函数在功能上类似, Tab ( n )函数是以列坐标的方式来定位写人或输出的位置,而 Spc ( n )函数表示的是两个数据输出项之间的间距。

 

( 2 )顺序文件的读操作

所有文本文件均可视为顺序文件进行读写操作。在 VB 中,实现读操作的语句和函数共有三个, Input 语句、 Line Input 语句、 Input 函数,下面予以介绍 Input 语句、 Line Input 语句。

Input 语句格式:

Input #文件通道号,变量列表

功能:该语句用于从通道号指定的文件中读取数据。变量列表为接收各数据项的变量的一个列表,各变量之间用逗号进行分隔,从文件中读出的数据将分别存人这些变量中。

使用时,应注意保证读出的数据的类型应与接收数据的变量的类型保持一致。该语句常与 Write 语句配合使用。

该语句在读取文件时,以遇到的第一个不为空格的字符或数字作为数据项的开始,连续读取数据,直到再次遇到空格、逗号或行尾,则认为该数据项结束,然后将所读出的数据存人指定的变量中,接着再按同样的方式读取下一个数据项,直到遇到文件结束符为止。

 

6 . 2 . 2 文件的随机存取 (返回)

随机文件是以记录为单位进行存取的,要读或写随机文件,首先应定义好文件的记录结构。

1 . 随机文件结构的定义

随机文件是以固定长度的记录为单位进行存储和访问的,而记录则是由若干个数据项(即字段)组成,每一个数据项可以有不同的数据类型和宽度,记录的长度是各数据项宽度的总和。

为了将一条记录的全部数据项完整保存下来 VB 采取定义一个具有多种数据类型的复合型变量来保存一条记录的全部数据项,通过访问复合型变量的字段成员,即可获得该条记录中的某个字段(数据项)的值;通过给复合型变量的每一个字段成员赋值,然后将复合型变量的值写人文件,就可实现向文件写人一条记录。

复合型变量的字段成员的个数以及数据类型,由记录的字段个数和类型决定。在 VB 中,要存取一个随机文件的记录,首先应将该记录的所有字段信息定义为一个自定义的数据类型,然后利用这个自定义的数据类型去定义复合变量。

( 1 )自定义数据类型的语句

格式:

Type <自定义的数据类型名>

成员 1 As 数据类型

成员 2 As 数据类型

……

成员 n As 数据类型

End Type

功能:定义一个具有多种成员和数据类型的复合数据类型。

要创建或读写随机文件,首先应将记录的全部字段定义为一个复合型变量。为此,应先定义一个具有这些字段和数据类型的复合数据类型,然后再用自定义的数据类型去定义复合变量。假设自定义的复合数据类型名为 Rstudent ,则定义方法为:

Type Rstudent ‘分别定义记录的各组成字段的名称、类型和宽度

xh As String*4 ‘定义为固定宽度的字符型变量

xm As String*6

xb As String*4

dy As Boolean

End Type

通过该语句,就定义了一个名为 Rstudent 的数据类型,其用法与基本数据类型相同,可利用该类型来定义变量。下面定义具有该种数据类型的变量 RecordValue ,以后就可利用该变量来存取随机文件的记录内容。

Public RecordValue As Rstudent

定义数据类型和定义该变量的语句,应放在模块中定义,以使其具有全局性。

( 2 )复合变量的成员的访问方法

VB 对随机文件的存取采用复合变量来实现,所读的记录内容或者要写的记录内容均是存放在复合变量的各个成员中的,为了获得或设置记录的某个字段的值,只需访问相应的成员变量即可,其访问方法为:

复合变量名.成员名

若要设置 RecordValue 复合变量中的 xh 成员变量的值,则可用如下语句实现:

RecordValue . bh = ”0201”

有了复合变量之后,就可从随机文件中将一条记录的全部数据一次性读出,并存储在复合变量中,通过访问复合变量的成员,就可获得该条记录的某一个字段的值。同样,若要将一条记录的数据保存到随机文件中,只需将各字段(数据项)的值依次赋给复合变量的各个成员保存,然后用文件的写操作语句将复合变量的值写人到随机文件,从而可实现一条记录的写人。

2 .随机文件的打开与读写操作

( 1 )随机文件的打开

随机文件的打开仍用 Open 语句,其具体用法格式为:

Open 文件名 For Random [Access 操作类型 ][ 加锁类型 ] As [ # ] 通道号 [Len= 记录长度 ]

随机文件打开后,可任意进行读或写操作,若打开的文件不存在,则创建该文件。记录长度可利用 Len 函数测试复合变量而得到。

随机文件的关闭仍用 Close 语句,用法相同。

( 2 )随机文件的写操作

随机文件的写操作采用 Put 语句来实现。

格式: Put # 文件通道号 ,[ 记录号 ], 复合变量

功能:将复合变量保存的记录内容写人到通道号指定的文件的指定记录位置。其中,记录号为可选项,若缺省该项参数(此位置的逗号不能省),则将数据写人到当前记录位置。

在用 Open 语句打开一个数据文件后,系统会自动为其创建一个记录指针,指针所指的记录称为当前记录。写人新记录数据后,记录指针会自动下移,即记录号会自动加 l 。

( 3 )随机文件的读操作

随机文件创建好以后,若要读取访问其中的记录数据,可用 Get 语句来实现。

格式:

Get #文件通道号, [ 记录号 ] ,复合变量

功能:从文件通道号所代表的文件中,按指定的记录号读取该条记录的全部内容,并将其存人复合变量之中。

若缺省记录号参数(但此处的逗号不能缺省),则读取当前记录。刚打开的文件,记录指针指向首记录,其记录号为 l 。

利用该语句一次只能读出一条记录的数据,若要读取多条记录,则可用循环来实现。

 

6 . 2 . 3 文件的二进制存取 (返回)

二进制存取是以字节为单位对文件数据进行读或写的一种操作。文件以二进制方式打开后,可同时进行读或写操作,并允许用户直接读写任何文件的任何字节信息,因此,该种文件存取方式适用面比较广。

•  二进制文件的打开与关闭

( 1 )二进制文件的打开

格式: Open “ 文件名 ” For Binary As # 文件通道号

( 2 )二进制文件的关闭

二进制文件的关闭仍采用 Close 语句,用法均一样。

•  二进制文件的读写操作

( 1 )二进制文件的写操作

二进制文件的写操作由 Put 语句来完成。

格式: Put # 文件通道号, [ 位置 ] ,变量

功能:将变量中的数据写人到文件的指定位置。

( 2 )二进制文件的读操作

格式: Get # 文件通道号, [ 位置 ] ,变量

功能:从通道号指定的文件的指定位置开始,读取若干个字节的数据,井将其寄存在语句指定的变量中。

“位置”参数用于说明要读取的数据的字节位置,该参数项为可选项,若省略该参数(参数项后的逗号不能省),则从当前位置的下一个字节开始读取数据,文件中的第一个字节的位置号为 1 。

语句每次所读取的数据的字节数,由变量的宽度所决定。因此,在程序中定义变量的宽度,可决定每次从文件中读取多少个字节的数据。

 

在 VB 中,字符的默认编码格式是 UniCode ,每个字符均采用 2 个字节进行编码。 8 个字节相当于 4 个字符的宽度。因此,定义保存数据的变量时应定义为:

Dim ReadData As String* 4

运行程序,所读取的数据为“进制文件”。