简单地说,文件是某种类型的二进制序列。在Delphi中,有三类文件:类型化、文本和非类型化。类型化文件是包含特定类型数据的文件,例如双精度、整数或以前定义的自定义记录类型。文本文件包含可读的ASCII字符。当我们想要对文件施加尽可能少的结构时,使用非类型化文件。
文本文件由以CR/LF(#13#10)组合结尾的行组成,而类型化文件则由取自特定类型数据结构的数据组成。
例如,下面的声明创建了一个名为TMember的记录类型和一个TMember记录变量数组。
type TMember = record Name : string[50]; eMail : string[30]; Posts : LongInt; end; var Members : array[1..50] of TMember;在将信息写入磁盘之前,我们必须声明一个文件类型的变量。下面的代码行声明了一个F文件变量。
var F : file of TMember;注意:要在Delphi中创建类型化文件,我们使用以下语法:
var SomeTypedFile:SomeType的文件
文件的基类型(SomeType)可以是标量类型(如Double)、数组类型或记录类型。它不应该是长字符串、动态数组、类、对象或指针。
要开始使用Delphi中的文件,我们必须将磁盘上的文件链接到程序中的文件变量。要创建此链接,我们必须使用AssignFile过程将磁盘上的文件与文件变量相关联。
AssignFile(F, 'Members.dat')一旦建立了与外部文件的关联,必须“打开”文件变量F,以准备读取和写入。我们调用重置过程来打开现有文件,或者调用重写来创建新文件。当程序完成处理文件时,必须使用CloseFile过程关闭该文件。关闭文件后,将更新其关联的外部文件。然后,文件变量可以与另一个外部文件关联。
一般来说,我们应该始终使用异常处理;使用文件时可能会出现许多错误。例如:如果我们为一个已经关闭的文件调用CloseFile,Delphi会报告一个I/O错误。另一方面,如果我们试图关闭一个文件,但尚未调用AssignFile,则结果是不可预测的。
假设我们用Delphi成员的姓名、电子邮件和帖子数量填充了一个数组,并希望将这些信息存储在磁盘上的一个文件中。以下代码将完成此工作:
var F : file of TMember; i : integer; begin AssignFile(F,'members.dat') ; Rewrite(F) ; try for j:= 1 to 50 do Write (F, Members[j]) ; finally CloseFile(F) ; end;end;要从“members.dat”文件检索所有信息,我们将使用以下代码:
var Member: TMember F : file of TMember;begin AssignFile(F,'members.dat') ; Reset(F) ; try while not Eof(F) do begin Read (F, Member) ; {DoSomethingWithMember;} end; finally CloseFile(F) ; end;end;注意:Eof是结束文件检查功能。我们使用这个函数来确保我们没有试图读取超过文件结尾的内容(超过最后存储的记录)。
文件通常按顺序访问。当使用标准过程读取或使用标准过程写入读取文件时,当前文件位置将移动到下一个按数字顺序排列的文件组件(下一条记录)。键入的文件也可以通过标准过程Seek随机访问,该过程将当前文件位置移动到指定的组件。FilePos和FileSize函数可用于确定当前文件位置和当前文件大小。
{go back to the beginning - the first record} Seek(F, 0) ; {go to the 5-th record} Seek(F, 5) ; {Jump to the end - "after" the last record} Seek(F, FileSize(F)) ;您刚刚学会了如何编写和读取整个成员数组,但如果您只想查找第10个成员并更改电子邮件,该怎么办?下一个过程正是这样做的:
procedure ChangeEMail(const RecN : integer; const NewEMail : string) ;var DummyMember : TMember;begin {assign, open, exception handling block} Seek(F, RecN) ; Read(F, DummyMember) ; DummyMember.Email := NewEMail; {read moves to the next record, we have to go back to the original record, then write} Seek(F, RecN) ; Write(F, DummyMember) ; {close file}end;就这样,现在你有了完成任务所需的一切。您可以将成员的信息写入磁盘,也可以将其读回,甚至可以更改文件“中间”的一些数据(例如电子邮件)。
重要的是,此文件不是ASCII文件,这是它在记事本中的外观(只有一条记录):
.Delphi Guide g Ò5·¿ì. 5. . B V.Lƒ ,„¨[email protected]Ï.. ç.ç.ï.....于那些数据被曝光的人来说都是坏消息。 由于数百万人使用Dropbox、Google Drive和MicrosoftOneDrive等服务,每天都会将一个看似永无止境的数据流推到云上。如果您将部分(或全部)数据存储在云上,如果出现漏洞,您可以采取什么...
...HTML那样是固定格式。 将每个XML文件视为一个自包含的数据库。标记——XML文档中的标记,用尖括号隔开——描绘记录和字段。标记之间的文本是数据。用户使用解析器和解析器公开的一组对象执行诸如检索、更新和插入XML数...
...可能性是无穷无尽的:exe中的HTML、exe中的exe、exe中的空数据库,等等。
...们还将介绍一些最常见逻辑错误的解决方案。 表格和数据库 在几乎每个Delphi应用程序中,我们都使用表单向用户显示和检索信息。Delphi为我们提供了一系列丰富的可视化工具,用于创建表单并确定其属性和行为。我们可以在...
...含可由所有应用程序表单共享的通用源代码信息。 除非使用包含程序图标和版本信息的Windows资源文件(RES),否则无法编译Delphi项目。它还可能包含其他资源,如图像、表格、光标等。RES文件由Delphi自动生成。 注意:以DPR...
...为一名优秀的Delphi程序员,那么“接口”、“实现”和“使用”等词需要在您的编程知识中占有特殊的位置。 德尔福项目 当我们创建一个Delphi应用程序时,我们可以从一个空白项目、一个现有项目或Delphi的一个应用程序或...
...程序。 如果您的Delphi版本高于4,那么您所要做的就是使用Console应用程序向导。Delphi5介绍了控制台应用程序向导。您可以通过指向File | New来访问它,这将打开一个新项目对话框-在新页面中选择控制台应用程序。请注意,在Delp...
...的每个值都有一个唯一的后继值,因此在处理顺序类型时使用了几个预定义函数: 作用 影响 作战需求文件(X) 给出元素的索引 Pred(X) 转到类型中X前面列出的元素 成功(X) 转到类型中X后面列出的元素 十二月...
...Delphi应用程序传输到Excel。如何创建工作表并使用MS Access数据库中的自定义数据填充工作表。 如何连接到microsoft excel Microsoft Excel是一个功能强大的电子表格计算器和数据分析工具。由于Excel工作表的行和列与数据库表的行和...
为您的下一个Delphi应用程序寻找单文件、单用户数据库?需要存储一些特定于应用程序的数据,但不想使用注册表/INI/或其他什么? Delphi提供了一个本地解决方案:TClientDataSet组件——位于组件调色板的“数据访问”选项卡上...