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代表标准输出文本文件,即显    示器。

平时我们所说的读和写语句,实际上是从Input文件中读入变量值,或向Output文件写入指定变量的值,其中省略了默认变量Input和Output的形式。例如,下列两条语句    等价:

Read(i, j);            //从Input文件中读入变量值,省略Input

Read(input, i, j);   //从Input文件中读入变量值

虽然Input是文本文件,但从Input文件中可以读入非字符的整数类型等变量值,系统已经自动进行了数据类型的转换,这一功能是普通文本文件所没有的。

下列语句两两等价:

Readln(i,j); 与 Readln(input, i,j);

Readln();    与 Readln(input);

Write(i,j);  与 Write(output,i,j);

Writeln(i,j);与 Writeln(output, i,j);

Writeln();   与 Writeln(output);

9.3.4 无类型文件操作

仅以file声明的文件变量称为无类型文件变量。例如:

var f: file;

无类型文件变量f代表二进制字节文件,而不管每个字节表示什么类型的数据元素。

对无类型文件的读/写操作由BlockRead和BlockWrite过程实现,它们以二进制数据块为单位,通常一个数据块为128个字节,一次可读或写若干数据块。

9.3.5 文件的随机操作

除了顺序存取,文件还有随机存取方式,即按记录位置的编号进行读/写操作,通常对记录式文件采用随机存取方式,而对文本文件这种字符流式文件则不采用随机存取方式。

有关随机存取的操作如下,这些操作仅用于类型文件和无类型文件,不能用于文本  文件。

function FileSize(var f: file): Int64;     //返回文件长度,即记录总数

function FilePos(var f: file): Int64;      //返回文件当前记录编号

procedure Seek(var f: file, n: integer);  //跳过n个记录位置

procedure Truncate(var f: file);             //截断文件

记录编号通常从0开始计数。给定一个记录编号,调用Seek(f,n)过程,文件的读/写指针将从当前记录位置处跳过n个记录,定位在所需的记录位置处,进行读/写操作。调用Truncate(f ) 过程将文件从当前记录处截断,从当前记录至文件尾的若干记录则被删除。

采用顺序存取方式,通常将读文件和写文件的操作分开进行,以Reset( )方式打开文件准备读,以Rewrite( )方式打开新文件准备写,读和写操作分别进行。

实际上,对于可读写的类型文件和无类型文件,以Reset( )和Rewrite( )两种方式打开文件,既可以读取数据也可以写入数据,同时支持随机存取方式。

以Reset( )方式打开文件时,文件的原有内容仍保留,系统设置的文件指针定位于第一个记录,记录号为0。此时,如果写数据,则将原第一个记录内容覆盖。例如:

Reset(f);       //当前记录号为0

Write(f,p);    //覆盖当前记录内容

如果将文件指针定位于文件尾,则可在原文件之后增加新内容。例如:

Reset(f);

Seek(f,FileSize(f));   //定位到文件尾

Write(f,p);              //追加记录

以Rewrite( )方式打开文件时,文件原有内容不保留,文件指针定位于第一个记录,记

录号为0,这是要写入的记录位置。写入若干记录后,可以改变文件指针,再读记录,      例如:

Rewrite(f);

Write(f ,p);

Write(f ,p);

Seek(f,0);

Read(f,p);   //读出第一个记录

9.3.6 与文件目录相关的标准过程和函数

Delphi在System、SysUtils等单元中定义了与文件和目录操作有关的若干过程/函数。

1.System单元中与目录操作有关的过程/函数

procedure ChDir(const s: string);      //改变当前目录

procedure MkDir(const s: string);       //创建一个新的子目录S

procedure RmDir(const s: string);      //删除一个空的目录S

function Flush(var t:Text): integer;  //清空文本输出缓冲区

function IOResult: integer;             //返回I/O操作状态。

procedure Move(const Source; var Dest; Count: Integer);

//将源数据块以字节形式拷贝至目的数据块

2.SysUtils单元中与文件操作有关的过程/函数

function GetCurrentDir: string;                           //返回当前目录路径名

function SetCurrentDir(const Dir: string): Boolean;   //设置当前目录

function FileCreate(const FileName: string):Integer;  //创建文件

function FileExists(const FileName: string): Boolean; //判断指定文件是否存在

function CreateDir(const Dir: string): Boolean;        //创建新目录

function ExpandFileName(const FileName: string): string;

//从文件名返回完整的文件路径名

function ExtractFileDir(const FileName: string): string;

//从文件路径名中返回目录路径名

function ExtractFileName(const FileName: string): string;

//从文件路径名中返回文件名和扩展名

function ExtractFileExt(const FileName: string): string;

//从文件路径名中返回扩展名

function DeleteFile(const FileName: string): Boolean; //删除指定文件

function RenameFile(const OldName, NewName: string): Boolean;

//重命名指定文件

function FileGetAttr(const FileName:string):Integer;   //返回指定文件的属性

function DiskSize(Drive: Byte): Int64;     //返回指定驱动器的总容量

function DiskFree(Drive: Byte): Int64;     //返回指定驱动器的剩余磁盘空间

Delphi 文件处理(4)相关推荐

  1. Delphi文件操作函数

    1.IncludeTrailingPathDelimiter和ExcludeTrailingPathDelimiter IncludeTrailingPathDelimiter(const S:Str ...

  2. delphi文件操作

    如何在delphi中操作文件的读与写?    我刚开始接触delphi,如何在delphi中操作文件的读与写,哪位朋友指教一下非常感谢!最好来段源码. var f:text; ...   Assign ...

  3. delphi 文件夹操作

    文件的拖放和打开拖拽 user shellapi type TForm1 = class(TForm) ListView1: TListView; procedure FormCreate(Sende ...

  4. DELPHI 文件操作 万一博客

    文件管理类函数(1) //判断文件是否存在 FileExists var f: string; begin f := 'c:/temp/test.txt'; if not FileExists(f) ...

  5. Delphi 文件处理

    1.文件类型概念 Delphi使用文件类型来读写存储在外部存储介质上的文件.一个文件变量能够与任意种类的外部设备建立通信,包括磁盘.打印机.键盘.绘图仪.调制解调器等. 例如,程序运行时可以从磁盘文件 ...

  6. Delphi文件读写操作常用的方法

    在进行win32开发中对文件的读写是最常用的操作之一,这编文章西西小编和大家一起来学习一下在Delphi中如何读写文件的方法. Delphi 支持三种文件类型:  文本文件.记录文件.无类型文件. 文 ...

  7. Delphi文件正文提取开发组件--文件内容搜索的高效工具

    Graccvs文件正文提取开发组件支持各种文件提取正文,为Lucene/CLucene, Elasticsearch, Sphinx等全文检索工具,为OA,ERP,CRM系统使用文件提供文件正文使用和 ...

  8. Delphi 文件操作(路径、目录)

    Delphi利用系统环境变量获取常用系统目录 //譬如 %WINDIR% 是表示系统目录的系统变量, 可以这样获取: var s: string; begin s := GetEnvironmentV ...

  9. Delphi 文件操作 AssignFile()

    RAD Studio 10.2.3 测试√ procedure TForm_Tips.Button_AssignFileClick(Sender: TObject); varFileName: str ...

最新文章

  1. python计时函数_python计时函数
  2. 问题1:程序员要做一辈子?
  3. emoji表情 与 iconfont 一锅炖
  4. python基础网易_十年Python大牛花了三天总结出来的python基础知识实例,超详细!...
  5. git修改文件权限方式
  6. js处理json和字符串示例
  7. 找钢网王东:3年赚900亿他是怎么做到的?
  8. x86汇编指令集大全
  9. 考研【研究所和高校的区别、全国375所独立于高校系统之外的 “研究生所”】
  10. delete函数的动态解析
  11. 消息队列状态:struct msqid_ds
  12. 【181220】VC++ 简易的人工智能模型源程序源代码
  13. 【华为交换机】STP生成树协议端口选举详解
  14. python修改pdf内容_如何编辑pdf文件,替换其数据?
  15. 软考信息系统项目管理师知识点总结(高项十大管理案例分析作文)
  16. Zend与PHP之间到底是什么关系
  17. 天才程序员之陨落:在业余项目创业 Cloudflare,公司上市前患病失去自理能力...
  18. wordpress api_掌握WordPress分类API
  19. 动手学习深度学习——Pytorch版教程系列汇总(长期更新版)
  20. C指针之初始化(三)

热门文章

  1. 阿里云ONS RocketMQ接入指南
  2. 为什么现在的人工智能助理都像人工智障?
  3. spoj#GCJ1C09C - Bribe the Prisoners
  4. 学习方法、艾宾浩斯遗忘曲线
  5. Win11玩游戏突然没有声音怎么恢复
  6. 计算机课给别人交作业检讨书,没交作业检讨书500字范文
  7. 课堂练习4-C语言多分支结构
  8. 从源码深入接触ThreadX(1) --- 了解ThreadX
  9. CF Edu 47E. InterCity Travelling 期望线性,打表
  10. 龙芯3A5000LL与i7-10700的UnixBench跑分对比