390 likes | 652 Views
第 8 章 Delphi 7.0 的文件系统. 本章要点: 文件的概念与文件类型 在 Delphi 7.0 中打开、关闭和读写文本文件的方法 在 Delphi 7.0 中打开、关闭和读写记录文件的方法 与文件有关的函数的使用. 8.1 循序渐进学理论. 8.1.1 文件的基本概念 通常所说的文件是指存放在磁盘上的一组相关信息的集合,也称磁盘文件。为了区分不同的文件,可给每个磁盘文件一个标识,称为 “ 磁盘文件名 ” 。 1 .文件的分类 ( 1 )文本文件与二进制文件
E N D
第8章 Delphi 7.0的文件系统 本章要点: 文件的概念与文件类型 在Delphi 7.0中打开、关闭和读写文本文件的方法 在Delphi 7.0中打开、关闭和读写记录文件的方法 与文件有关的函数的使用
8.1 循序渐进学理论 8.1.1 文件的基本概念 通常所说的文件是指存放在磁盘上的一组相关信息的集合,也称磁盘文件。为了区分不同的文件,可给每个磁盘文件一个标识,称为“磁盘文件名”。1.文件的分类 (1)文本文件与二进制文件 按文件中的数据格式分,文件可分成“二进制文件”和“文本文件”; (2)顺序文件与随机文件 按读写方式来分类,文件可分成“顺序文件”和“随机文件”
2.使用磁盘文件的步骤 几种常见使用方式的实现步骤。 (1)创建文件 创建一个不存在的文件,一般要经历以下几个步骤: 创建文件——写入数据——关闭文件 (2)读取文件 读写一个已存在的文件,一般要经历以下几个步骤: 读打开文件——读取数据——关闭文件 (3)向一个文件的末尾添加数据 向一个已存在的文件末尾添加数据,一般要经历以下 几个步骤: 添加打开文件——写入数据——关闭文件
(4)读文件中某一位置的数据(随机读) 读取已存在文件的某个位置的数据,一般要经历以下几个步骤: 读打开文件——定位——读取数据——关闭文件 (5)修改文件中某一位置的数据(随机写) 修改已存在文件的某个位置的数据,一般要经历以下几个步骤: 写打开文件——定位——修改数据——关闭文件
3.文件指针 磁盘文件打开后,将会产生一个指针,它指向下一次要读写的数据位置,该指针称为“文件指针”。文件指针具有自动移动的功能,文件刚打开时,文件指针指向磁盘文件中的第1个数据(记录或文本),当读取了这个数据后,文件指针自动指向下一个数据。当把数据写入某个文件时,文件指针总是自动指向下一次要写入数据的位置。文件指针随文件的打开而存在,随文件的关闭而消失。
8.1.2 Delphi 7.0中的文件类型及文件类型变量的定义 1.文本文件变量的定义 使用文件前需要定义一个文件型的变量,文本文件型变量的定义格式如下。[格式]:Var 文本文件变量名: TextFile; 2.记录型文件变量的定义 记录型文件变量的定义一般要分成三个步骤,下面以定义一个存放学生数据的记录型文件变量为例来说明记录型文件变量的定义方法。
(1)定义记录类型 定义一个学生记录类型,如下: type Student= record //定义通信录记录型 No:String[10]; Name: string[10]; Age:integer; Sex:String[2]; Class:string[30]; end;
(2)定义记录文件类型 根据记录类型定义记录文件类型,定义记录文件类型语句的格式如下。 [格式]:记录文件类型名=File of 记录类型名 例如,有下列语句: StudentFile = File of Student;//定义学生记录 文件类型 该语句定义了一个记录文件类型StudentFile。
(3)定义记录文件类型的变量 记录文件类型定义好后,应根据文件类型定义变量,根据文件类型定义变量的语句格式如下。 [格式]:Var 记录文件类型变量名:记录文件类型; 例如,有下列语句: var VFStudent:StudentFile; //定义文件类型变量 该语句定义了一个记录文件类型变量VFStudent,该变量可以用来与一个记录文件相联系,相应文件中只能存放Student记录型的数据。
8.1.3 文本文件的使用 1.文本文件的打开 打开文本文件可分成两个步骤:一是把文件变量与实际的文本文件关联起来;二是打开相应的文本文件。 (1)关联文本文件变量与文本文件 可通过AssignFile过程来关联文件变量与实际的磁盘文件,该过程的格式如下。 [格式]:procedure AssignFile(var F; FileName: string);
例如,有以下语句: var LetterFile:TextFile;//定义文件型变量 …… AssignFile(LetterFile,‘Myletter.txt’);//把文件型变量与文件名联系在一起 (2)打开文本文件 把磁盘文件与文件型变量关联在一起后,就可以打开文件了,打开文件可使用Reset、Rewrite或Append过程中的一个来进行。 ①Rewrite过程 [格式]:procedure Rewrite(var F: File [; Recsize: Word ] );
②Append过程 [格式]:procedure Append(var F: Text); ③Reset过程 [格式]:procedure Reset(var F [: File; RecSize: Word ] ); 2.文本文件的关闭 文本文件使用过后要关闭,关闭文件使用CloseFile过程,该过程的格式如下: [格式]:procedure CloseFile(var F);
例如,有下列语句: AssignFile(LetterFile,'Myletter.txt');//把文件型变量与文件名联系在一起 Rewrite(LetterFile);//创建指定的文件 …… CloseFile(LetterFile);//关闭与文件型变量LetterFile联系在一起的文件 3.文本文件的读写 (1)文本文件的写操作Write过程的格式如下。 [格式]:procedure Write( [var F: Text; ] P1 [ , P2,..., Pn] ); 使用Write和Writeln向文本文件中写入数据时,还可以指域宽和小数位。
①指定域宽 要给Write和Writeln输出的数据指定域宽,只需要相应的数据后增加一个“:”和一个表示域的宽度的数字。例如,有以下程序段: var F1, F2: TextFile;//定义两个文本文件变量 N1,N2,N3:Integer; …… SFileName:='C:\A1.TXT' ;//取得源文件名 N1:=100;N2:=200;N3:=300; AssignFile(F1, SFileName); //把源文件名和F1文件型变量联系在一起
Rewrite(f1); Writeln(F1,N1:10,N2:10,N3:10); Writeln(F1,N1:2,N2:2,N3:2); CloseFile(F1); //关闭源文件 …… 在C:\A1.TXT文件中输出的结果如下: 100 200 300 100200300
②指定小数位 在把实数输出到文本文件中时,可以指定小数点位数。指定方法是在域宽数字后加“:”再加上表示小数点位数的整数。例如,有以下程序段: var F1, F2: TextFile;//定义两个文本文件变量 N1,N2,N3:Real; …… SFileName:='C:\A1.TXT' ;//取得源文件名 N1:=12.5;N2:=2.1;N3:=30.12; AssignFile(F1, SFileName); //把源文件名和F1文件型变量联系在一起
Rewrite(F1); Writeln(F1,N1:10,N2:10,N3:10); Writeln(F1,N1:10:2,N2:10:2,N3:10:2); CloseFile(F1); //关闭源文件 …… 在C:\A1.TXT文件中输出的结果如下: 1.2E+0001 2.1E+0000 3.0E+0001 12.50 2.10 30.12
(2)文本文件的读操作 可使用Read和ReadLn过程从文本文件中读取数据,并赋值给相应的变量。 Read过程的格式如下。 [格式]:procedure Read( [ var F: Text; ] V1 [, V2,...,Vn ] ); 例如,假设C:\a1.txt文件中的数据如下: 12.50 2.10 30.10 Basic Pascal Delphi Visual Basic 有下列程序段: var F1, F2: TextFile;//定义两个文本文件变量 N1,N2,N3:Real;
s1,s2,s3:string; …… SFileName:='C:\A1.TXT' ;//取得源文件名 AssignFile(F1, SFileName); //把源文件名和F1文件型变量联系在一起 Reset(f1); Readln(F1,N1,N2,N3); Read(F1,s1,s2,s3); Edit1.Text :=Floattostr(N1)+' ' +Floattostr(N2)+ ' '+ Floattostr(N3); Edit2.Text :=S1; Edit3.Text :=S2; Edit4.Text :=S3; CloseFile(F1); //关闭源文件 ……
4.行尾与文件尾的判断 判断当前文件指针是否处于行尾和文件尾,可通过函数Eoln和Eof来实现。 (1)Eof函数 [格式]:function Eof [ (var F: Text) ]: Boolean; (2)Eoln函数 [格式]:function Eoln [(var F: Text) ]: Boolean;
【例8-1】编写一个文本文件的复制程序。程序的设计界面如图8-3所示,程序的运行界面如图8-4所示。程序运行时,在“源文件名”后面的文本框中输入源文件名或通过按后面的【…】按钮选择一个需复制的源文件名,在“目标文件名”后面的文本框中输入要复制成的目标文件名,然后按【复制】按钮,将完成源文件到目标文件的复制。
图8-3 程序设计界面 图8-4 程序运行界面
8.1.4 记录文件的使用 1.记录型文件的打开和关闭 和文本文件一样,AssignFile标准过程用来关联记录文件变量与实际的磁盘文件,Reset和Rewrite标准过程用来打开记录文件,CloseFile标准过程用来关闭记录文件。 例如,有如下程序段: var VFStudent:StudentFile; //定义文件类型变量
S1,S2:Student; …… AssignFile(VFStudent, 'C:\S1.DAT');//把记录型文件变量VFStudent与文件C:\S1.DAT相关联 Rewrite(VFStudent); …… CloseFile(VFStudent);//关闭与记录型文件变量VFStudent相关联的文件
2.记录型文件的读写 要把记录写入到记录文件中,需调用Write函数并传递给它一个文件变量以及一个或多个记录型变量。 例如,下面的代码把变量s1和变量s2中的内容写入到与记录型文件变量VFStudent相关联的文件中去: Write(VFStudent,S1); Write(VFStudent,S2); 上面的两条语句也可写成: Write(VFStudent,S1,S2)
3.记录型文件的文件指针与记录数 可以认为文件有一个看不见的指针指着下一次Read或Write操作要作用的记录。无论何时打开文件,也不管是用Reset或Rewrite打开,这个不可见指针都定位在文件首。 记录文件中的记录是顺序排列的,每条记录都有一个编号,记录编号从0开始。因此在包含N个记录的文件中,第一个记录的编号(或称记录号)是0,最后一个记录的编号是N-1。
4.移动与检测记录文件的文件指针 移动和检测文件指针的位置使随机存取文件中的记录成为可能,记录的随机存取是通过Seek过程和FilePos函数来实现的。 Seek过程的格式如下: [格式]:procedure Seek(var F; N: Longint); FilePos函数的格式如下: [格式]:function FilePos(var F): Longint;
例如,要读取与VFStudent文件型变量相关联的文件的第五条记录,可使用如下语句:例如,要读取与VFStudent文件型变量相关联的文件的第五条记录,可使用如下语句: Seek(VFStudent,4); Read(VFStudent,S1); 例如,下面的代码用来读取、修改并更新文件中的一条记录。 Seek(VFStudent,4); Read(VFStudent,S1); S1.Name='赵强’; Seek(VFStudent,4); write(VFStudent,S1);
5.把记录文件的文件指针定位到文件尾的方法5.把记录文件的文件指针定位到文件尾的方法 最简单的办法是用FileSize获得文件的记录个数,并用这个数值作为seek的参数, FileSize函数的格式如下: [格式]:function FileSize(var F): Integer; 例如,有下列语句: Seek(VFStudent,FileSize(VFStudent)); 由于记录数从0开始,在一个由N个记录组成的文件中最后一个记录数是N-1。FileSize返回的是文件的记录个数,值为N而不是N-1。
【例8-2】编写一个录入学生数据的应用程序,程序的设计界面如图8-5所示,程序的运行界面如图8-6所示。程序刚运行时,【录入】按钮可用,【确定】和【取消】按钮不可用。此时按【录入】按钮,将清空所有的编辑框并等待用户输入一条新记录,并且置【录入】按钮为不可用状态,置【确定】和【取消】按钮为可用状态。当用户输入了一条记录后按【确定】按钮将把输入的记录写入到文件中去,按【取消】按钮将取消用户的输入,并把最后一条记录的值显示在界面上,无论是按【确定】按钮还是【取消】按钮后,均把【录入】按钮置为可用状态,把【确定】和【取消】按钮置为不可用状态,且把所有的编辑框置为只读状态。
图8-5 程序设计界面 图8-6 程序运行界面
8.2 典型实例练能力 8.2.1 典型实例一:文本文件的显示、修改和保存 【实例题目】 编写一个文本文件的显示、修改和保存的程序,程序的设计界面如图8-7所示,程序的运行界面如图8-8所示。程序运行时,在文件名后面的编辑框中可以输入要打开的文件名,也可以通过单击其后的【…】按钮来弹出一个打开对话框供用户选择一个文本文件;单击【打开】按钮,将打开相应的文件并把文件的内容显示在Memo组件中;若在程序运行过程中修改了Memo组件中显示的文本内容,然后单击【保存】按钮将把文件保存起来;单击【关闭】按钮将关闭文件和结束应用程序。(要求:不得通过Memo1.Lines的SaveToFile和LoadFromFile方法来打开文件和保存文件)
图8-7 程序设计界面 图8-8 程序运行界面
8.2.2 典型实例二:求学生的平均成绩并保存 【实例题目】 在例8-2的基础上添加求学生平均成绩的功能。程序的设计界面如图8-9所示,程序的运行界面如图8-10所示。程序运行时,单击【求平均成绩】按钮将求出所有学生的平均成绩,然后在【记录号】后面的编辑框中输入一个记录号,单击【显示】按钮将显示相应记录的学生信息,包括平均分。
图8-9 程序设计界面 图8-10 程序运行界面
8.3 上机练习重应用 8.3.1 上机练习一:统计文本文件中的单词数【练习题目】 编写一个统计文本文件中的单词数的程序。程序的设计界面如图8-11所示,程序的运行界面如图8-12所示。程序运行时,可在文件名后面的编辑框中输入一个文本文件名或通过打开对话框选择一个文本文件名,然后单击【统计】按钮将统计出该文本文件中包含的单词个数并显示在第二个编辑框中。单击【退出】按钮将关闭文件并退出应用程序。
图8-11 程序设计界面 图8-12 程序运行界面
8.3.2 上机练习二:学生信息的浏览 【练习题目】 编写一个学生信息的浏览程序,程序的设计界面如图8-13所示,程序的运行界面如图8-14所示。程序运行时,单击【首记录】按钮将会显示第一条记录的内容,单击【前移】按钮将会显示前一条记录的内容,单击【后移】按钮将会显示下一条记录的内容,单击【末记录】按钮将会显示最后一条记录的内容。注意移动记录指针的时候,相应按钮的状态变化,如移动到文件头时,【首记录】和【前移】按钮不能用,移动到文件尾时,【后移】和【末记录】按钮不能用。
图8-13 程序设计界面 图8-14 程序运行界面