第8章数据文件8.1文件概述文件是程序设计中一个重要的概念。它是存储在外部介质上的数据的集合,通常情况下,计算机处理的大量数据都是以文件的形式存放在外部介质(如磁盘)上的,操作系统也是以文件为单位对数据进行管理。如果想访问存放在外部介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据。要向外部介质存储数据也必须先建立一个文件(以文件名标识),才能向它输出数据。1.记录由若干个相互关联的数据项组成。例如,由学生的学习成绩信息组成的记录2.文件分类文件是记录的集合,例如,某班有100个同学,则100个同学的记录组成了1个学生成绩文件。·按内容:程序文件和数据文件·按存储信息的形式:ASCII文件和二进制文件●按访问模式:顺序访问、随机访问、二进制访问模式(1)顺序访问模式:顺序访问模式的规则最简单,读出时从第一条记录“顺序”读到最后一条记录,写入时也一样,不可以在数据间乱跳(例如读完第一条后直接读第三条)。记录可长可短。优点:结构简单,访问模式简单,处理文本文件方便缺点:必须按顺序访问,不能同时进行读写操作(2)随机访问模式:随机文件,记录的长度相同。在随机访问模式中,文件中的每条记录的长度都是相同的,记录与记录之间不需要特殊的分隔符号,如下图所示。用户只要给出记录号,就可以直接访问某一特定记录。因此,与顺序模式相比,它的优点是存取速度快,更新容易。记录1记录2记录N假如有一个班级的成绩要处理,每个同学的数据一样,则采用随机访问模式相当合适。如果某天想更改张三的成绩,只要找到张三的那条记录,直接更改该记录就可以。(3)二进制文件:直接把二进制码存放在文件中,没有什么格式。二进制访问模式是以字节数来定位数据,允许程序按所需的任何方式组织和访问数,也允许对文件中各字节数据进行存取访问和改变。事实上,任何文件都可以用二进制模式访问。二进制模式与随机模式很类似,如果把二进制文件中的每一个字节看作是一条记录的话,则二进制模式就成了随机模式。8.2顺序文件1.打开文件例8.1对文件C:IScores.dat进行读写Open文件名For模式As[#]文件号模式Output进行写操作Input进行读操作Append在末尾追加记录文件号1~511
第 8 章 数据文件 8.1 文件概述 文件是程序设计中一个重要的概念。它是存储在外部介质上的数据的集合,通常情况下, 计算机处理的大量数据都是以文件的形式存放在外部介质(如磁盘)上的,操作系统也是以文 件为单位对数据进行管理。 如果想访问存放在外部介质上的数据,必须先按文件名找到所指定的文件,然后再从该 文件中读取数据。要向外部介质存储数据也必须先建立一个文件(以文件名标识),才能向它 输出数据。 1. 记录 由若干个相互关联的数据项组成。例如,由学生的学习成绩信息组成的记录 2. 文件分类 文件是记录的集合, 例如,某班有 100 个同学,则 100 个同学的记录组成了 1 个学生成绩 文件。 ⚫ 按内容:程序文件和数据文件 ⚫ 按存储信息的形式:ASCII 文件和二进制文件 ⚫ 按访问模式 :顺序访问、随机访问、二进制访问模式 (1)顺序访问模式:顺序访问模式的规则最简单,读出时从第一条记录“顺序”读到最后一 条记录,写入时也一样,不可以在数据间乱跳(例如读完第一条后直接读第三条)。记录可长 可短。 优点:结构简单,访问模式简单,处理文本文件方便 缺点:必须按顺序访问,不能同时进行读写操作 (2)随机访问模式:随机文件,记录的长度相同。 在随机访问模式中,文件中的每条记录的 长度都是相同的,记录与记录之间不需要特殊的分隔符号,如下图所示。用户只要给出记录 号,就可以直接访问某一特定记录。因此,与顺序模式相比,它的优点是存取速度快,更新 容易。 记录 1 记录 2 . 记录 N 假如有一个班级的成绩要处理,每个同学的数据一样,则采用随机访问模式相当合适。 如果某天想更改张三的成绩,只要找到张三的那条记录,直接更改该记录就可以。 (3) 二进制文件:直接把二进制码存放在文件中,没有什么格式 。 二进制访问模式是以字节数来定位数据,允许程序按所需的任何方式组织和访问数,也 允许对文件中各字节数据进行存取访问和改变。 事实上,任何文件都可以用二进制模式访问。二进制模式与随机模式很类似,如果把二 进制文件中的每一个字节看作是一条记录的话,则二进制模式就成了随机模式。 8.2 顺序文件 1. 打开文件 例 8.1 对文件 C:\Scores.dat 进行读写 Open 文件名 For 模式 As [#]文件号 模式 Output 进行写操作 Input 进行读操作 Append 在末尾追加记录 文件号 1~511
注意:文件名可以为字符串常量,也可以是字符变量。例如,如果要打开C:IVB目录下一个文件名为SCORE的文件,供写入数据,指定文号为#1,则命令应为:Open"C:|VB\SCORE"ForOutputAS#l。2.写入数据使用语句Print和Write(1)WriteWrite#文件号,【输出列表]Write在数据项之间插入“,”并给字符串加上双引号。例如Write(1,“One”,“Two”,123)写入到文件后格式:"One","Two",123(2)PrintPrint#文件号,【输出列表]Print#语句功能与Write基本相同,区别在于字符串不加双引号,数据之间没有“,”。例如,Print#1,"One","Two",123写入到文件后格式:OneTwo123例8.2利用Print和Write语句把数据写入文件3.关闭文件输出语句是将数据送到缓冲区,关闭文件时才将缓冲区中数据写入文件。关闭文件形式:Close([[#]文件号])例Close(1)或Close#1关闭1号文件。如果省略了文件号,Close语句将关闭所有已经打开的文件4.读操作(1)Input#从打开的顺序文件中读出数据并将数据赋给变量。Input#文件号,变量列表为了能够用Input#将文件中的数据正确地读出,在将数据写入文件时,要使用Write#语句而不是用Print#语句。因为Write#语句可以确保将各个数据项的正确区分开。例如:执行Write#1,“051023”,“王海涛”,66,文件增加如下:“051023”,“王海涛”,其中66是长整型,没加“”。若执行下列语句,三个变量读入变量Dim No, Name As String, Score As IntegerInput#l,No,Name,Score注意:1、读出变量与写入变量数据类型相同2、若用print写入,很难按原来的数据类型读出。(2)LineInput读出一行数据,并将读出的数据赋给指定的字符串变量LineInput#文件号,字符串变量说明:读出的数据中不包含回车换行符5.与读文件(包括随机文件,二进制文件)有关的重要函数有两个:(1)EOF(文件号):测试文件指针是否到文件末尾当到文件末尾时,EOF函数返回True,否则返回False。对于顺序文件用EOF函数测试是否到文件尾;对于随机文件和二进制文件,当最近一个执行的Get语句无法读到一个完整记录时返回True,否则返回False。(2)LOF(文件号)测试文件的长度,例如,LOF(1)返回#1文件的长度,如果返回0值,则表示该文件是一个空文件
注意:文件名可以为字符串常量,也可以是字符变量。 例如,如果要打开 C:\VB 目录下一个文件名为 SCORE 的文件,供写入数据,指定文号为#1, 则命令应为: Open"C:\VB\SCORE" For Output AS #1。 2.写入数据使用语句 Print 和 Write (1) Write Write #文件号,[输出列表] Write 在数据项之间插入“,”并给字符串加上双引号。 例如 Write(1, “One”, “Two”, 123) 写入到文件后格式:"One","Two",123 (2) Print Print # 文件号,[输出列表] Print #语句功能与 Write 基本相同,区别在于字符串不加双引号,数据之间没有“,”。 例如,Print #1,"One","Two",123 写入到文件后格式: One Two 123 例 8.2 利用 Print 和 Write 语句把数据写入文件 3.关闭文件 输出语句是将数据送到缓冲区,关闭文件时才将缓冲区中数据写入文件。关闭文件形式: Close( [[#]文件号]) 例 Close(1)或 Close #1 关闭 1 号文件。 如果省略了文件号,Close 语句将关闭所有已经打开的文件 4.读操作 (1) Input# 从打开的顺序文件中读出数据并将数据赋给变量。 Input #文件号,变量列表 为了能够用 Input #将文件中的数据正确地读出,在将数据写入文件时,要使用 Write #语句而不是用 Print # 语句。因为 Write#语句可以确保将各个数据项的正确区分开。 例如:执行 Write #1, “051023”, “王海涛”, 66 ,文件增加如下: “051023”, “王海涛”, 其中 66 是长整型,没加“”。若执行下列语句,三个变量读入变量 Dim No, Name As String, Score As Integer Input #1, No, Name, Score 注意:1、读出变量与写入变量数据类型相同 2、若用 print 写入,很难按原来的数据类型读出。 (2) LineInput 读出一行数据,并将读出的数据赋给指定的字符串变量 LineInput #文件号, 字符串变量 说明:读出的数据中不包含回车换行符 5.与读文件(包括随机文件,二进制文件)有关的重要函数有两个: (1) EOF (文件号):测试文件指针是否到文件末尾当到文件末尾时,EOF 函数返回 True,否 则返回 False。对于顺序文件用 EOF 函数测试是否到文件尾;对于随机文件和二进制文件, 当最近一个执行的 Get 语句无法读到一个完整记录时返回 True,否则返回 False。 (2) LOF (文件号)测试文件的长度,例如,LOF(1)返回#1 文件的长度,如果返回 0 值,则 表示该文件是一个空文件
是以字节为大小的文件大小,不是所包含的字符数,如:”1949年中华人民共和国成立“,返回24,实际字符数14将一个文本文件的内容读入文本框有下列三种方法。这里假定文本框名称为txtTest,文本文件名为MYFILE.TXT。方法1:把文本文件的内容一行一行地读入文本框。txtTest.Text=""Open"MYFILE.TXT"ForInputAs#1Do While Not EOF(#1)LineInput #1,InputData“读出一行数据赋给InputDatatxtTest.Text=txtTest.Text+InputData+vbCrLf,将读出一行数据添加到文本框未尾LoopClose #1方法2:把文本文件的内容一次性读入文本框。txtTest.Text=""Open"MYFILE.TXT"ForInputAs#1txtTest.Text=Input(LOF(#1),#1)Close #1方法3:把文本文件的内容一个字符一个字符地读入文本框。Dim InputDataas String*ltxtTest.Text=-""Open"MYFILE.TXT"ForInputAs#1Do While Not EOF(1)InputData=Input(1,#1)txtTest.Text=txtTest.Text+InputDataLoopClose #1应用举例例8.3设计一个文件加密程序。窗体上有“打开文件”、“加密”和“保存文件”三个命令按钮,它们的名称分别为cmdOpen、cmdSave和cmdCode,两个文本框的名称分别为txtSource和txtTarget,另外有一个通用对话框CommonDialogl。例8.4编写顺序文件读写程序。→选择“添加数据”,则将一个学生的学号、姓名和成绩(Integer)添加到Score.txt文件中→选择“读取数据”,则从文件读取数据并计算总分和平均成绩,最后送入文本框。8.3随机访问模式在随机访问模式中,文件的存取是按记录进行操作的,每个记录都有记录号并且长度全部相同。无论从内存向磁盘写数据,或从磁盘读数据,都需事先定义内存空间:而内存空间的分配是靠变量说明来进行的,所以不管是读操作还是写操作都必须事先在程序中定义变量,变量要定义成随机文件中一条记录的类型,一条记录又是由多个数据项组成的,每个数据项有不同的类型和长度。因此在程序的变量说明部分采用用户自定义类型说明语句,首先定义记
是以字节为大小的文件大小,不是所包含的字符数,如:”1949 年中华人民共和国成立“, 返回 24,实际字符数 14 将一个文本文件的内容读入文本框有下列三种方法。这里假定文本框名称为 txtTest,文本 文件名为 MYFILE.TXT。 方法 1:把文本文件的内容一行一行地读入文本框。 txtTest.Text="" Open "MYFILE.TXT" For Input As #1 Do While Not EOF(#1) Line Input #1,InputData ‘读出一行数据赋给 InputData txtTest.Text=txtTest.Text+InputData+vbCrLf ’将读出一行数据添加到文本框末尾 Loop Close #1 方法 2:把文本文件的内容一次性读入文本框。 txtTest.Text="" Open "MYFILE.TXT" For Input As #1 txtTest.Text=Input(LOF(#1),#1) Close #1 方法 3:把文本文件的内容一个字符一个字符地读入文本框。 Dim InputData as String*1 txtTest.Text=" " Open "MYFILE.TXT" For Input As #1 Do While Not EOF(1) InputData=Input(1,#1) txtTest.Text=txtTest.Text+InputData Loop Close #1 应用举例 例 8.3 设计一个文件加密程序。 窗体上有“打开文件”、“加密”和“保存文件”三个命令按钮,它们的名称分别为 cmdOpen、cmdSave 和 cmdCode,两个文本框的名称分别为 txtSource 和 txtTarget,另外有 一个通用对话框 CommonDialog1。 例 8.4 编写顺序文件读写程序。 ◆ 选择“添加数据”,则将一个学生的学号、姓名和成绩(Integer)添加到 Score.txt 文件中 ◆ 选择“读取数据”,则从文件读取数据并计算总分和平均成绩,最后送入文本框。 8.3 随机访问模式 在随机访问模式中,文件的存取是按记录进行操作的,每个记录都有记录号并且长度全 部相同。 无论从内存向磁盘写数据,或从磁盘读数据,都需事先定义内存空间;而内存空间的分 配是靠变量说明来进行的,所以不管是读操作还是写操作都必须事先在程序中定义变量,变 量要定义成随机文件中一条记录的类型,一条记录又是由多个数据项组成的,每个数据项有 不同的类型和长度。因此在程序的变量说明部分采用用户自定义类型说明语句,首先定义记
录的类型结构,然后再将变量说明成该类型,这样就为这个变量申请了内存空间,用于存放随机文件中的记录。程序框架:1、定义数据类型及变量;2、打开文件3、读或写4、关闭文件随机访问模式中文件的打开和关闭打开文件Open文件名ForRandomAs#文件号[Len=记录长度]口随机文件打开后,可以同时进行写入与读出操作口记录长度默认值是128个字节关闭随机文件Close([#]文件号)例8.5编写一个随机文件应用程序随机访问模式中文件的读写Put[#]文件号,[记录号],变量名将一个记录变量的内容,写入所打开的磁盘文件中指定的记录位置处。如果忽略记录号,则在当前记录前插入一条记录。Get[#]文件号,[记录号],变量名将指定的记录内容读入记录变量中。如果忽略记录号,则表示读出当前记录后的那一条记录8.4二进制访问模式二进制访问模式与随机访问模式类似,读写语句也是Get和Put,区别在于二进制模式的访问单位是字节,而随机模式的访问单位是记录例如:Open"C:\Student.Dat"ForBinaryAs#1例8.7编写一个文件复制程序Dim char As ByteOpen"C:IS.Dat"For Binary As #1Open"C:IS.Bak" For Binary As # 2Do While Not EOF(1)Get #l,,char,读源文件一个字节,写一个字节到目标文件Put#2,,charLoopClose #1关闭源文件,关闭源文件Close #2本章小节■文件文件是记录的集合,三种访问模式-顺序访间打开Open文件名,模式,文件号写面PrintWrite读Input#文件号,变量LineInput#文件号-随机访问Open文件名ForRandomAs#文件号Len=长度读Get写Put■二进制访间与随机访问模式类似
录的类型结构,然后再将变量说明成该类型,这样就为这个变量申请了内存空间,用于存放 随机文件中的记录。 程序框架:1、定义数据类型及变量;2、打开文件 3、读或写 4、关闭文件 随机访问模式中文件的打开和关闭 打开文件 Open 文件名 For Random As #文件号 [Len=记录长度] 随机文件打开后,可以同时进行写入与读出操作 记录长度默认值是 128 个字节 关闭随机文件 Close([#]文件号) 例 8.5 编写一个随机文件应用程序 随机访问模式中文件的读写 Put[#]文件号,[记录号],变量名 将一个记录变量的内容,写入所打开的磁盘文件中指定的记录位置处。如果忽略记录号,则 在当前记录前插入一条记录。 Get [#]文件号,[记录号],变量名 将指定的记录内容读入记录变量中。如果忽略记录号,则表示读出当前记录后的那一条记录 8.4 二进制访问模式 二进制访问模式与随机访问模式类似,读写语句也是 Get 和 Put,区别在于二进制模式的访 问单位是字节,而随机模式的访问单位是记录 例如:Open "C:\Student.Dat" For Binary As # 1 例 8.7 编写一个文件复制程序 Dim char As Byte Open "C:\S.Dat" For Binary As # 1 Open "C:\S.Bak" For Binary As # 2 Do While Not EOF(1) Get #1, , char ' 读源文件一个字节 Put #2, , char ' 写一个字节到目标文件 Loop Close #1 ' 关闭源文件 Close #2 ' 关闭源文件 本章小节 文件 文件是记录的集合,三种访问模式 顺序访问 打开 Open 文件名,模式,文件号 写 Print Write 读 Input # 文件号,变量 LineInput #文件号 随机访问 Open 文件名 For Random As #文件号 Len=长度 读 Get 写 Put 二进制访问 与随机访问模式类似