Delphi 文件处理(4)
9.3.1 文件类型
1.文件类型概念
Delphi使用文件类型来读写存储在外部存储介质上的文件。一个文件变量能够与任意种类的外部设备建立通信,包括磁盘、打印机、键盘、绘图仪、调制解调器等。
例如,程序运行时可以从磁盘文件中读取数据,向磁盘文件写入数据;程序运行结束后,数据仍保存在磁盘文件中,不会丢失。
2.文件类型分类
根据文件中数据元素的数据类型,可将文件类型分为文本文件、类型文件和无类型 文件。
(1)文本文件。
元素类型是字符char,每个元素占用一个字节,以回车换行符表示每行结束。Delphi定义的标准文本文件类型是text或textfile,两个标识符同义。
(2)类型文件。
元素类型可以是整数、实数或记录等除文件以外的数据类型。每个元素所占的字节数由元素类型决定。
(3)无类型文件。
以字节byte为单位对文件中的二进制数据元素进行操作,而不管每个字节表示什么类型的数据元素。
3.文件与数组的区别
文件的定义与数组很像,都是由相同数据类型的数据元素组成的序列。但文件不同于数组,区别如下:
· 数组是由固定多个元素组成,而文件的长度是不定的,随机的。
· 数组元素总是存放在内存,而文件则往往与外部介质相联系。
· 数组元素以“数组名[下标]”的形式访问,而文件则需通过文件变量来访问。
9.3.2 类型文件操作
1.类型文件定义与变量声明
类型文件的类型定义格式如下:
type类型文件=file of数据类型;
其中,file、of是关键字,“数据类型”是文件的元素类型。例如:
type
intFile=file of integer; //整型文件类型
var
f:file of integer; //f是整型文件变量
文件的元素类型必须是固定长度的数据类型,不能是文件、动态数组、长字符串、指针或包含不固定长度域的记录类型。例如:
fx:file of intFile; //编译错,文件的元素类型不能是文件
Delphi中的字符串类型string,由于要支持长字符串,其大小是不固定的,因此不能作为文件的数据类型,但可以使用短字符串类型ShortString,因为它具有256字节的固定长度。当遇到string带长度时,Delphi会自动将string转换为ShortString类型,此时亦可作为文件的元素类型。例如:
var f1:file of ShortString; //ShortString类型为256个字节
f2:file of string[20]; //string[20]为20个字节
f3:file of string; //编译错,记录长度不确定
固定长度的记录类型可以作为文件的元素类型,但包含不固定长度域的记录类型则不可以。例如,以下定义的记录类型phoneEntry可以作为文件的元素类型:
type
phoneEntry = record
name: string[20];
phoneNumber: string[20];
address: string[100];
end;
phoneList = file of phoneEntry;
2.为文件变量指定相应文件
在使用文件变量进行文件操作之前,必须调用AssignFile过程建立文件变量与待操作文件之间的联系。
AssignFile过程声明如下:
procedure AssignFile(var f; filename:string);
其中,f为文件变量名,f声明为无类型的变量参数,声明为无类型参数是为了与所有文件类型兼容;FileName为文件名字符串,是包括文件名的全路径名。例如:
AssignFile(f,'D:\Output.dat');
指定了文件变量f与磁盘文件'D:\Output.dat'相关联,其后对变量f的操作都是针对指定文件的。
3.打开文件
指定文件名后,对文件操作之前,应先打开文件。有以下两种打开文件方式:
(1)Reset方式。
调用Reset过程打开一个已存在文件,然后可从文件中读取数据,也可向文件写入数据。Reset过程声明如下:
procedure Reset(var f [: File; RecSize: Word]);
打开文件变量f所指定的文件,文件变量指向文件开头的第一个元素。当指定文件不存在时,产生I/O异常EInOutError。
(2)Rewrite方式。
Rewrite过程声明如下:
procedure Rewrite(var f:File[; Recsize: Word]);
调用Rewrite过程,系统以f指定的文件名,在磁盘上创建一个空文件并准备写入数据。如果f指定文件已存在,则该文件将被覆盖,原有内容丢失。
4.读入文件
调用Reset打开文件后,可使用Read过程读取文件内容。过程声明如下:
procedure Read(var f, v1{, v2});
其中f为文件变量,v1、v2为待输入的变量名,v1等变量的数据类型是文件的元素 类型。
当读取整型和实型数据时,文件中的数据元素用空格分隔,且必须符合数据格式,否则将产生I/O错误。
5.判断文件是否结束
在读取文件之前,必须判断文件是否结束。只有未到文件结束点,才能读取数据。Eof函数声明如下:
function Eof(var f):Boolean;
当文件变量f指向文件尾部,读入文件结束标记时,表示文件结束,Eof函数返回True,否则返回False。
6.向文件写入数据
调用Rewrite打开文件后,使用Write过程向文件中写入数据。过程声明如下:
procedure Write(var f, v1{, v2});
向文件f中写入若干个文件元素型变量v1、v2的值。
7.关闭文件
无论是以Reset或Rewrite方式打开文件,在对文件操作完毕后,都必须使用CloseFile过程关闭文件,声明如下:
procedure CloseFile(var f);
关闭文件后,系统释放文件使用的资源。
以Rewrite方式打开文件,调用Write过程时,数据先写入内存缓冲区,只有缓冲区满或关闭文件时,才把数据真正写入磁盘中,并写入文件结束标记。如果写完数据后不关闭文件,可能造成数据的丢失。
9.3.3 文本文件操作
1.文本文件变量说明
Delphi定义了TextFile类型表示文本文件,它与Pascal语言中的Text类型完全相同。例如:
var f:TextFile; //声明文本文件变量f
2.文件类型共同的操作
与类型文件一样,对文本文件进行操作也需要以下几个步骤:
(1)声明文件变量f。
(2)调用AssignFile过程为文件变量f指定相关文件。
(3)调用Reset或Rewrite过程打开文件f。
(4)Reset打开文件,当未到文件尾,即Eof(f )返回false时,调用Read(f,i)过程,读入文件f的一个元素值存放在变量中。
(5)Rewrite打开文件时,调用Write(f,i)过程,将变量i的值写入文件f中。
(6)关闭指定文件CloseFile(f )。
3.仅用于文本文件的操作
(1)与类型文件定义不同的过程与函数。
对于文本文件,读、写等过程和函数的定义与类型文件定义有所不同,声明如下:
procedure Read([var f: Text;]v1{, v2));
function Eof[(var f:Text)]: boolean;
procedure Write([var f: Text;]p1{, p2});
(2)Append添加方式打开文件。
Append过程声明如下:
procedure Append(var f: Text);
调用Append过程打开文件,文件变量指向文件尾部,此后写入的数据添加在文件原有数据之后。如果文件不存在,则产生I/O异常。
(3)Readln按行读取字符串。
Readln过程声明如下:
procedure Readln([var f: Text;] v1{, v2});
Readln读取以回车换行符结束的一行字符串,之后跳过回车换行符,再读下一行。
(4)判断行是否结束。
对于文本文件,也可以调用Read(f,c)过程逐个地读取字符,此时可以使用Eoln函数判断行是否结束。Eoln函数声明如下:
function Eoln [(var f: Text) ]: boolean;
当文件变量f读取回车换行符时,表示一行结束,Eoln函数返回True,否则返回False。
对于文本文件,既可以调用Readln过程按行读取字符串,也可以调用Read过程逐个读取字符。需注意读入回车换行符时的操作,例如,Readln读完一行数据后,再使用Read读取字符串将得到空串。
以上所述Append、Writeln、Readln、Eoln例程只对文本文件有效,对类型文件无效。
数据既可以保存在类型文件中,也可以保存在文本文件中。两种方式各有所长,存于类型文件中,数据隐蔽性较强,但读取不方便,必须根据要求特别编写读入程序;存于文本文件中,可使用记事本等多种工具打开文本文件,不必特别编写读入程序,但数据是公开的,无法隐藏。实际应用时,可根据需求有所选择。
4.标准输入输出
由于键盘和显示器是操作系统默认的标准输入/输出设备,操作系统对设备的访问也是基于文件进行的,并且标准输入/输出文件都是以字符为基本元素的文本文件。
为此,Delphi定义了两个默认的文本文件变量Input和Output,用于处理标准的输入与输出操作。
Input代表标准输入文本文件,即键盘;Output代表标准输出文本文件,即显  
补充:软件开发 , Delphi ,