纸质数据结构

在DOS操作中,我们所说的文件叫做外部文件。外部文件存储在外部设备上,比如外存,可以由计算机操作系统管理,比如用dir、type等命令直接操作文件。

帕斯卡所说的文件被称为内部文件。内部文件的特点是文件的实体(实际文件)也存储在外部存储器中,成为外部文件的一部分。但在使用时,必须用程序中的某些语句与实际文件链接起来,建立一一对应关系,实际文件必须用内部文件的逻辑名进行操作。内部文件的逻辑名称必须符合PASCAL语言标识符的命名规则。

Pascal中的文件主要用于存储大量数据。比如:成绩管理,有大量的原始数据,先用文件存储在磁盘,然后通过程序读取文件中的数据进行处理,比不使用文件更方便有效。

Pascal中的文件被定义为相同类型元素的线性序列。文件中的元素按照一定的顺序排列,每个元素都可以从头到尾访问。从定义上看,文件类似于数组,但它们之间有明显的区别,主要如下:

(1)文件的每个元素按顺序存储在外部文件设备(如磁盘)上。因此,文件可以由Pascal程序或文本编辑软件生成,如edit、ws、Turbo Pascal的edit命令等。在程序执行之前,或在运行过程中由程序生成,运行后仍存储在外部设备上。

(2)在系统内,通过文件指针管理对文件的访问。文件指针是一个计算器,它记录程序在文件中的位置。在固定的时刻,程序只能读取或写入文件中的一个元素。在将元素写入文件或从文件中读取元素后,相应的文件指针会移动到下一个元素位置。而数组由下标访问。

(3)在文件类型的定义中,不需要指定文件的长度,也就是元素的个数,这意味着元素的数据是可以动态变化的。文件可以非常大,包含许多元素,也可以是没有任何元素的空文件。数组中元素的数量是固定的。

使用文件大致有以下步骤;

(1)解释文件类型,定义文件标识符;

(2)建立内部文件和外部文件之间的联系;

(3)打开文件;

(4)操作文件;

(5)关闭文件。

Turbo Pascal将文件分为三类:文本文件(顺序)、类型化文件(顺序或随机)和非类型化文件(顺序或随机)。这些文件及其操作将在下面描述。

首先,文本文件

文本文件,又称文本文件或文本文件,可以被人直接阅读,是人机交流的基本数据形式之一。文本文件可以由文本编辑程序(如DOS edit或Turbo PASCAL edit命令)直接创建、读取和修改,也可以由PASCAL程序在运行过程中创建。

1,文本文件的定义:

文本文件就是文本,由ASCII字符组成,是Pascal提供的标准文件之一。Pascal对标准文件文本的描述如下:

TYPE TEXT =文件的字符;

因此,文本像标准类型INTEGER、READ等一样。,可直接用于变量描述,无需用户解释。例如:

VAR F1,F2:TEXT;

这里定义了两个文本文件变量F1和F2。

2、文本文件的建立

创建文本文件有两种方法:

(1)用Turbo Pascal编辑直接创建原始数据文件。

示例1将下表中的数据存储在名为A.dat的文件中

3 4

29 30 50 60

80 90 70 75

60 50 70 45

操作步骤:

①进入Turbo Pascal的编辑状态;

②输入数据;

③保存,文件名为A.dat

此时,数据已经存储在文本文件A.dat中,文本文件也可以通过DOS中的Edit等软件建立。

(2)通过程序建立中间数据或结果数据文件。

程序创建文件的步骤如下:

(1)定义文本文件变量;

(2)将外部文件名分配给文本文件变量,以将文本文件与相应外部文件相关联;

命令格式:ASSIGN(f,name)

f是定义的文本文件变量。

Name是实际的文件名。

例如:assign (f1,' file in.dat `)

或者:赋值(f1,' pas \ file in.res `)

这样,程序中文本文件变量F1的操作也是外部实际文件FILEIN的操作。在上面的例子中,文件FILEIN。“DAT”存储在当前目录中,而文件。“RES”存储在PAS子目录中。

③打开文本文件,准备写;

命令格式1:重写(f)

功能:创建并打开一个新文件进行写入。如果存在同名的现有文件,请将其删除并重新创建。

命令格式2:追加(f)

功能:打开现有文件并追加它。

④写文件;

命令格式:WRITE(f,)

Or: WRITELN(f,)

函数:将项目内容写入f文件。

(5)文件操作结束后,关闭文件。

命令格式:关闭(f)

例2从键盘读取表12.1的数据,用程序写入一个名为B.dat的文件。

3.读取文本文件

读取文本文件内容的操作步骤:

(1)定义文本文件变量;

②使用ASSIGN(f,name)命令将内部文件f与实际文件名链接起来;

③打开文本文件进行阅读;

命令格式:READ(f,;)READLN(f,& lt变量列表>;)

函数:将F文件中指针指向的数据读入变量。

文本文件提供了另外两个命令,在文本操作中非常有用。它们是:

永别了终结者

EOF(f):回显文件结束符

⑤文件操作完成后,使用关闭(f)命令关闭文件。

例3读出例12.1中创建的文本文件并输出。

因为文本文件是以ASCII码存储的,所以查看文本文件的内容非常方便。在DOS状态下,可以在DOS中使用TYPE等命令,在Turbo Pascal中,可以把文件作为程序拿出来查看。

4.文本文件的特征

(1)行结构

文本文件由几行组成,由行结束标记分隔,在文件的末尾有一个结束标记。由于每行的长度可能不同,无法计算出给定行在文本文件中的确切位置,所以只能对文本文件进行顺序处理,不能同时输入和输出一个文本文件。

(2)自动转换功能

文本文件的每个元素都是字符类型,但是当文件元素读入变量(整数、实数或字符串类型)时,Pascal会自动将其转换为与变量相同的数据类型。相反,当一个变量被写入文本文件时,它也会被自动转换成字符类型。

例4在一个研究组中有65,438+00人。他们参加一次考试,评定六个科目,统计每个人的总分和每个科目的平均分,将原始数据和结果数据放入一个文本文件中。

分析

(1)原始数据文件TESTIN。使用Turbo Pascal编辑建立DAT并存储在磁盘中。其内容如下:

10 6

1 78 89 67 90 98 67

2 90 93 86 84 86 93

3 93 85 78 89 78 98

4 67 89 76 67 98 74

5 83 75 92 78 89 74

6 76 57 89 84 73 71

7 81 93 74 76 78 86

8 68 83 91 83 78 89

9 63 71 83 94 78 95

10 78 99 90 80 86 70

(2)程序读入原始数据文件,求出每个人的总分和每门的平均分;

(3)建立文件名为TEXTIN的结果数据文件。决议.

程序:

例5读入一个可变长度的文本文件。排版:建立一个固定长度为60个字符的文件。排版要求:(1)当一行的末尾不是一个完整的单词时,将该行的最后一个字符位置替换为'-',即与下一行的头形成一个完整的单词;(2)第一行的表头是两个空格,其他行的表头不含空格。

分析

(1)创建原始数据文件。

(2)程序在排版的同时读取原始数据文件的内容。

(3)每行60个字符,满足题目中的排版条件,写入目标文件。

设置原始数据文本副本。DAT文件如下:

帕维尔被捕了。

那个母亲没有生火。

夜晚来了,冷风吹着。

有人敲窗户。

然后另一个。

母亲已经习惯了这样的敲打,但这一次她开始有点高兴了。

她披上围巾,打开了门。

程序:

在文本副本上运行程序。DAT文本文件来获取排版结果文件TEXTCOPY。RES内容如下:

帕维尔被捕了。那个母亲没有点燃炉子-

夜晚来了,冷风吹着。有人敲门

在窗口。然后另一个。母亲习惯了这样的敲门,b-

但是这一次她开始有点高兴了。扔披肩

她回头打开了门。

第二,文件有多种类型

文本文件中的所有元素都是字体字符。要在文件中存储混合数据,必须使用类型化文件。

1.类型化文件的定义

类型化文件中的元素可以混合存储为二进制格式,所以类型化文件(字符型文件除外,因为本质上是文本文件)不能像文本文件一样被编辑软件读取和处理。

类型化文件的类型描述格式为:

类型标识符= =基本类型的文件;

其中基本类型可以是除文件类型以外的任何类型。例如:

FILE 1 =整数文件;

FILE2 =字符串数组[1 - 10]的文件;

FILE3 =字符集文件;

FILE4 =真实的文件;

文件5 =记录文件;

名称:字符串;

课程:READ的数组[1-10];

孙:读书;

结束;

以此类推,其中文件2、文件3和文件5中的数组、集合和记录的类型可以在定义文件变量之前进行描述。

例如:

增值转销公司

f 1:FILE;

F2,F3:file 3;

F4:档案5;

像所有前面的类型描述和变量定义一样,文件类型描述和变量定义也可以合并,例如:

增值转销公司

F1:整数文件;

F2,F3:字符集文件;

F4:记录档案

名称:字符串;

课程:实数的数组[1-10];

和:读;

结束;

Turbo Pascal可以以顺序和随机方式访问类型化文件。

为了随机访问键入的文件,Turbo Pascal提供了以下命令:

命令格式1: seek (f,n)

函数:将当前指针移动到指定F文件的第N个组件,其中F为非文本文件,N为长整数。

命令格式2: filepos (f)

函数:返回当前文件指针,当前文件指针在文件头时返回。函数值是长整数。

命令格式3:文件大小(f)

函数:返回文件的长度。如果文件为空,则返回零,函数值是长整数。

2.建立打字文件

类型化文件只能由程序创建,操作步骤与文本文件类似,但区别在于:(1)类型化文件的定义与文本文件不同;(2)使用SEEK命令指定指针,可以随机写入类型化文件。

3.访问键入的文件

访问类型化文件的操作步骤与访问文本文件类似,但区别在于:(1)类型化文件的定义与文本文件不同;(2)类型化文件可以使用SEEK命令访问任何记录和记录中的任何元素。

例6:建立几个学生的姓名顺序、座位号、六门课程总成绩的打字档案。

分析:为了简单起见,假设有一个文本文件FILEDATA。TXT,其内容如下:

10

李红

1 89 67 56 98 76 45

王明

2 99 87 98 96 95 84

张艺宏

3 78 69 68 69 91 81

常洪

4 81 93 82 93 75 76

林星

5 78 65 90 79 89 90

罗泽

6 96 85 76 68 69 91

林金金

7 86 81 72 74 95 96

王政

8 92 84 78 89 75 97

毛凌

9 84 86 92 86 69 89

程颐

10 86 94 81 94 86 87

第一个数字10表示有10个学生,后面是第一个学生的名字,座位号,六个年级,然后是第二个学生,以此类推。

从文本文件中读取数据,找出每个人的总分,建立一个类型化的文件,文件名为filedata.fil,文件类型为record studreco,如下例所示。

程序:

在示例7中,生成的数字1-16的平方、立方和四次表存储在一个类型化文件中,以顺序方式访问一次,以随机方式访问两个数字11和15及其在文件中对应的平方、立方和四次值。

分析:打出来的文件的文件名是BIAO。FIL,并且文件的类型是实数。

(1)生成数字1-16及其平方、立方和四次值,并将它们写入表中。FIL,并顺序读出输出;

(2)用SEEK指针指向编号为11和15的文件的位置,位置分别为10×4和14×4(注意文件的第一个位置为0),读出值和对应的平方、立方、四次值进行输出。

程序:

程序运行结果如下:

此外,Turbo Pascal还提供了第三种形式的文件,即无类型文件。无类型文件是低级I/O通道。如果不考虑类型化文件、文本文件等磁盘上字节序列的逻辑解释,数据的物理存储也不过是一些字节序列。这样就和内存的物理单元一一对应了。无类型文件使用128个连续字节作为输入输出操作的记录(或组件),数据直接在磁盘文件和变量之间传输,节省了文件缓解区,因此比其他文件占用内存少,主要用于直接访问任何固定长度元素的磁盘文件。

这里不介绍非类型化文件的具体操作,请参考相关书籍。

第三,综合实例分析

例8为城市飞机建立一个往返邻接表。文本文件CITY。DAT包含以下内容:

第一行中的两个数字n和v;

n代表可以游览的城市数量,n为正数< 100;

V代表下面要列出的直飞航班数,V为正数< 100;

接下来的n行是城市名称,可以坐飞机去;

下一条V线每条线有两个城市,中间用空格隔开,表示两个城市有直航。

例如,CITY1 CITY2表示从CITY1飞往CITY2或从CITY2飞往CITY1。

生成文件城市。RES,由0和1组成的N×N邻接表。

邻接表被定义为:

分析

(1)从文本文件city.dat中读取的N个城市名存储在某数组CT中;

(2)读入V线换乘航班的城市名称,为每条线找到两个城市在CT中的位置L和K,建立邻接关系,其中lj[l,k]=1,LJ [K,J]= 1;

(3)将生成的邻接表写入文本文件CITY.RES。

让城市的内容。数据如下:

10 20

福州

北京

强迫…做…;(Shanghai)上海

武汉

香港

天金

沈燕

南禅寺

昌萨

广州

福州北津

福州上海

福州广州

北京上海

广州北金

武汉福州

上海广州

香港北京

福州香港

南川北津

南禅天金

天金北金

上海chansa

广州武汉

chansa beijin

武汉北金

沈燕北津

沈燕天金

上海沈燕

广州沈燕

程序:

获取的城市的内容。RES文件如下:

10

1福州

2北京

3上海

4武汉

5香港

6天金

7沈燕

8南禅

9 chansa

10广州

0 1 1 1 1 0 0 0 0 1

1 0 1 1 1 1 1 1 1 1

1 1 0 0 0 0 1 0 1 1

1 1 0 0 0 0 0 0 0 1

1 1 0 0 0 0 0 0 0 0

0 1 0 0 0 0 1 1 0 0

0 1 1 0 0 1 0 0 0 1

0 1 0 0 0 1 0 0 0 0

0 1 1 0 0 0 0 0 0 0

1 1 1 1 0 0 1 0 0 0

例9文件日期的内容。例12.3的FIL文件按总分排序。

分析:

文件排序是将文本文件的组成部分按照一定的要求进行排列,使文件有序。文件排序有两种:内部排序和外部排序。内部排序是指将文件的组成部分存储在一个数组中,然后排列该数组,最后将该数组存储在原始文件中。外部排列不同于内部排列。它不是将文件组件存储在数组中,而是直接对文件进行排序。内部排序比外部排序快,但是当文件很大时,它不能被转移到内存中。这时候用外排序比较合适。

这个程序使用SEEK进程来实现外部排序。

程序:

练习题

1.编写一个程序来计算文本文件中行尾标记的数量。

2.计算文本文件的平均、最大和最小行长度。

3.文本文件、文件。DAT,存储n个学生在某一科目的成绩,并将成绩转换成直方图存储在FILE.RES中。

例如,文件的内容。日期是:

78 90 87 73 84

直方图文件file的内容。RES如下:

********

*********

*********

*******

********

4.银行账户档案包含每个账户的账户细节:账号、名称、地址和收支平衡。写个程序,读入每个账户的账目,生成银行账户文件。

5.通讯录文件中每条记录的内容为:姓名、地址、公司、邮编、电话号码。一个程序被编程为按照姓名的顺序建立地址簿文件,这要求首先建立文件,然后按照姓名的顺序在外部排序。