10.2.1  顺序文件

10.2.1 顺序文件

顺序文件结构比较简单,文件中的记录一个接一个顺序存放。在这种文件中,要读取某个记录,必须从文件头开始,一个记录一个记录地顺序读取,不可以跳跃式访问。

该模式专门用于处理文本文件,每行文本相当于一个记录,每个记录可长可短,记录与记录之间用“换行符”来分隔。

顺序文件的写入步骤:打开、写入、关闭;读出步骤:打开、读出、关闭。

1.顺序文件写操作

要建立一个顺序文件或打开一个顺序文件,并向文件中写入数据,应该用Output方式打开文件,然后用输出命令写入数据。

以Output方式打开文件,就是建立文件;若文件已存在,则删除旧文件,建立新文件。以Append方式打开文件与之类似,二者的差别在于:以Append方式打开文件时,如果该文件已经存在,Visual Basic并不删除它,随后的输出命令把新行追加到该文件的尾部。

写文件的输出命令有以下两种。

(1)Print#语句

Print#语句的功能是把数据写入打开的文件中。其语法格式如下。

978-7-111-49659-5-Chapter10-1.jpg

Print#语句和Print方法功能类似,只不过一个输出的对象是文件,一个输出的对象是窗体、打印机或控件。Print#语句中除了比Print方法多一个文件号外,其他各参数都和Print方法相同。

说明:

1)与Print方法相似,如果Print#语句后面的“表达式”省略,则向文件中写入一个空行。如果Print#语句最后一项参数后面没有以分号或逗号结束,则下一条Print#语句将把数据写入文件的下一行。例如:

978-7-111-49659-5-Chapter10-2.jpg

2)与Print方法相同,Print#语句的各项参数直接可以用分号或逗号隔开,分别对应紧凑格式和标准格式。

【例10-1】窗体上创建一个文本框,允许多行输入,创建一个保存按钮,程序运行后,当单击保存按钮,则把文本框中用户输入的内容保存到文件中。

978-7-111-49659-5-Chapter10-3.jpg

【例10-2】随机生成100个小于1000的整数,并存入文件out.dat中。

程序代码如下:

978-7-111-49659-5-Chapter10-4.jpg

(2)Write#语句

Write#语句用来把数据写入到文件中。其语法格式如下。

978-7-111-49659-5-Chapter10-5.jpg

说明:

1)Write#语句没有Spc函数和Tab函数来控制输出位置。

2)“表达式”可以由多项组成,各项之间用逗号或分号分隔。在Write#语句中,用逗号或分号分隔的效果是一样的。也就是说,逗号和分号只是一个各项间的分隔符。如果最后一项参数后面没有逗号或分号,那么下一条Write#语句将从下一行开始写入数据,否则,下一条Write#语句在本行继续输出。

3)用Write#语句向文件写数据时,数据以紧凑格式存放。但Write#语句能自动在各项数据之间插入逗号,并给字符串数据两端加上双引号。例如:

978-7-111-49659-5-Chapter10-6.jpg

4)用Write#语句写入的正数前面没有符号位,即空格。

【例10-3】输入6名学生信息,包括:学号、姓名、年龄、籍贯,然后保存到文件out.dat中。

978-7-111-49659-5-Chapter10-7.jpg

用记事本打开该文件,内容如图10-1所示。

978-7-111-49659-5-Chapter10-8.jpg

图10-1 写入文件

2.顺序文件读操作

顺序文件的读操作有3种实现方法。

(1)Input#语句

Input#语句用于从文件中读取数据。其语法格式如下。

978-7-111-49659-5-Chapter10-9.jpg

说明:

1)“变量列表”可以由一个或多个变量组成,这些变量可以是不同的数据类型。与“变量列表”相对应,文件中数据项的类型应该和“变量列表”中变量的类型相同。如果变量为数值类型,而数据不是数值类型,则变量的值为零。

2)把读出的数据赋给数值型变量时,首先从文件中读取字符串,并忽略数值前面的空格、回车符和换行符,从遇到的第一个非空格、回车符和换行字符开始读取,若遇到空格、回车符、换行符或逗号,则结束读取。相当于对读出的字符串运用Val函数,从字符串中取出数值赋给变量。

例如,文件中存储了“201312ab,ab1220”,执行下面的语句:

978-7-111-49659-5-Chapter10-10.jpg

读取完毕后,a的值为2013,b的值为12,c的值为0,d的值为20。第1次读取“2013”,遇到空格结束读取,把2013赋给a。第2次读取“12ab”,遇到逗号结束读取,取出12赋给b。第3次读取“ab12”,遇到空格结束读取,数据类型不一致,变量c的值为0。第4次读取20,遇到文件尾结束读取,取出20赋给d。

3)把读出的数据赋给字符串变量时,同样忽略数值前的空格、回车符和换行符,遇到回车符、换行或逗号结束读取。但如果有双引号把一串字符括起来,则读取双引号中所有的字符(包括逗号、回车、换行符),并赋给字符串变量。Input#语句将忽略双引号。

【例10-4】用Input#语句读入例10-3文件out.dat中的学号、姓名、年龄、籍贯,并显示到窗体上。

978-7-111-49659-5-Chapter10-11.jpg

978-7-111-49659-5-Chapter10-12.jpg

程序运行结果如图10-2所示。

978-7-111-49659-5-Chapter10-13.jpg

图10-2 Input#语句读文件

(2)Line Input#语句

该语句用于从文件中读取一整行内容,并把它赋给一个字符串变量。其语法格式如下。

978-7-111-49659-5-Chapter10-14.jpg

Line Input#语句读取文件中一整行内容,赋给一个字符串变量,遇到回车符或换行符结束读取,但回车符和换行符不会赋给字符串。常用于文本文件的处理。

【例10-5】用Line Input#语句读入例10-3文件out.dat中的学号、姓名、年龄、籍贯并显示到文本框中(文本框属性MultiLine设置为True,ScrollBars设置为Both,文本框的初始值设置为空)。

由于Line Input#语句把一整行内容作为字符串读出,但并不包含回车符和换行符,因此,如果将其显示在文本框中需要在每行后添加回车符。

完整代码如下。

978-7-111-49659-5-Chapter10-15.jpg

程序运行结果如图10-3a所示。如果代码中缺少了回车符“&vbCrLf”,则所有内容将被显示在同一行中,结果如图10-3b所示。

978-7-111-49659-5-Chapter10-16.jpg

图10-3 Line Input#语句读文件

(3)Input函数

其语法格式如下。

978-7-111-49659-5-Chapter10-17.jpg

Input函数从文件中读取n个字符,并赋值作为字符串返回。与Input#语句不同,Input函数返回它所读出的所有字符,包括逗号、回车符、空白列、换行符、引号和前导空格等。