第 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文件型变量相关联的文件的第五条记录,可使用如下语句:
Seek(VFStudent,4);
Read(VFStudent,S1);
例如,下面的代码用来读取,修改并更新文件中的一条记录 。
Seek(VFStudent,4);
Read(VFStudent,S1);
S1.Name='赵强 ’ ;
Seek(VFStudent,4);
write(VFStudent,S1);
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 程序运行界面