文件操作
文件操作 不存储程序的计算机还不如一个强有力的计算器,最早购买不带磁盘驱动器的用户很快就明白了这一点——当他们关掉计算机的电源时,其工作成果也很就随之消失了。因而,当你的计算机有一个硬盘时,学习使用磁盘文件对编写有用的程序来说就是很重要的了。下面就来介绍Pascal文件的有关知识。
文件的概念 文件是指由一系列相同类型数据组成的一个数据序列,是一种由用户定义的构造型的数据类型。作为系统提供的一种手段,是计算机与各类设备进行通讯的媒介,从而用以实现信息在程序内外的交换。对于文件我们实际上早已在使用,前面出现的Pascal程序中的输入、输出就是应用文件的方法来实现的,这些文件的名字是Pascal的标准文件“INPUT”和“OUTPUT”,它们分别对应于标准输入设备和标准输出设备,在Free Pascal中可省略不写。
文件的分类 在Pascal的数据文件中,按文件结构形式划分,以ASCII代码形式(字符形式)存放的称为TEXT类型文件,也称为文本文件,这是我们经常要用到的文件类型。我们平时用到的 就是文本文件。(文本文件通常用记事本软件打开)
文本文件特征 (1)当程序开始把数据写(输出)到文件中去时,总是从文件的起始位置开始。也就是不能从文件的中间位置开始存放数据。 (2)输出的数据是一个接一个地存放在文件中的。 (3)当程序从文件中读(输入)数据到内存中时,总是从文件的起始位置开始。也就是不可能从文件的中间的某个位置开始读入数据。 (4)读数据时,必须按存入文件时的顺序一个接一个的读入内存中去。 (5)对同一个文件的读写操作不能交叉进行。
文本文件的定义 文本文件不是简单地由某类型的元素序列所组成,它的基本元素是字符,由它们构成行,若干行组成一份原文。由于各行的长度可以不同,所以文本文件只能顺序地处理。 文本文件的定义如下: var fp1,fp2:text;
文件类型的常用命令 (1) assign 语法:assign(filevar,filename); Filename是合法的文件名的字符串表达式,这个名字赋给文件变量filevar,在程序中对文件变量的操作即为对磁盘文件Filename的操作。 如:assign(fp1,’abc.in’); assign(fp2,’abc.out’); 这时fp1,fp2是文件类型变量,abc.in、abc.out是实际文件名字,这样文件变量fp1与abc.in、fp2与abc.out、就建立起联系了,在程序中fp1就可以代表abc.in文件、fp2就可以代表abc.out文件使用了。
(2)rewrite 语法:rewrite(filevar) 功能:创建一个新的磁盘文件,并以写的方式打开该文件,初始化文件为空,文件指针指向开始位置。在使用此命令前需先用assign过程,给文件变量一个实在的文件名。 如:rewrite(fp2); 这时将在磁盘上工作目录下新建一个空文件abc.out,并打开该开件。若以前工作目录下存在abc.out,则会将原来的文件清空,并将文件指针指向开始位置。
(3)reset 语法:reset(filevar); 功能:打开一个已存在的文件,并将文件指针指向开始位置,表示可开始读入文件,但不能向文件写数据,同样filevar文件名必须存在。 如:reset(fp1); 打开fp1所代表的文件abc.in,并将文件指针指向开始位置。如果工作目录下不存在abc.in,将会出现错误信息2。
(4)close 语法:close(filevar) 功能:关闭一个文件,无论是向磁盘写文件,还是从磁盘上读取文件的内容,当读、写完毕时都必须用close命令关闭已打开的文件,以保证文件的完整性和可靠性,否则将引起文件处理错误。 如:close(fp2); 这时将关闭文件fp2,对于被读的文件,可以关闭也可以不关闭,但对于被写的文件,程序结束时,必须关闭,否则,所有写入的信息将不会被写入文件。
(5)read或readln 语法:read(filevar,var1,var2,…,varm) 功能:从文件filevar中读出若干个数,赋给变量var1,…,varm,这里使用规则和read原来的使用方法相同,只不过在原来变量前加一个文件类型变量filevar而已。 如:read(fp1,a,b);这时将从abc.in文件读出两个量分别赋值给a和b两个变量。
(6)write或writeln 语法:write(filevar, var1,var2,…,varm); 功能:向文件filevar中写入若干个数。这里使用规则和write原来的使用方法相同,只不过在原来变量前加一个文件类型变量filevar而已。 如:write(fp2,a,b);这时将向abc.out文件写入a和b两个变量的值。
(7)eoln函数 语法:eoln(filevar); 功能:行结束函数,其中文件filevar一定为text类型,函数值为布尔型。当文件指针向回车换行符时,函数值为true(真),否则为false(假)。
(8)eof函数(相当于seekeof()) 语法:eof(filevar) 功能:文件结束函数,其中文件filevar是文件类型变量,函数值是布尔值。当文件指针指向文件结束标志时,函数值为true (真),否则为false(假)。它通常写作seekeof。该函数一般用以判断文件是否结束。
文件类型输入输出一般用法 在我们使用文件类型输入输出时,通常用标准输入文件input和标准的输出文件output来表示文件类型变量,这样在程序中的输入输出操作就和不用文件类型输入输出格式一样了。具体形式如下: 文件输入输出一般格式: 程序体的开始处加上: assign(input,'输入文件名'); {将输入文件和标准输入文件input建立起联系} reset(input); {打开输入文件} assign(output,'输出文件名'); {将输出文件和标准输出文件output建立起联系} rewrite(output); {建立输出文件} 程序体的结尾处加上: close(input); {关闭输入文件} close(output); {关闭输出文件} 注意:在运行程序前,一定要在FP的工作目录中建立一个输入文件。否则将出错。
例:读入两个整数,输出两个数的和。用文件类型输入输出。文件名为:abc.pas 测试数据: 输入文件: abc.in 152 908 输出文件: abc.out 1060
我们运行一下,发现这两个程序的功能是一样的,因此,我们用文件类型输入输出时,一般用程序2的形式。 程序1: program abc; var fp1,fp2:text; a,b,c:longint; begin assign(fp1,'abc.in'); reset(fp1); assign(fp2,'abc.out'); rewrite(fp2); read(fp1,a,b); c:=a+b; write(fp2,c); close(fp1); close(fp2); end. 程序2: program abc; var a,b,c:longint; begin assign(input,'abc.in'); reset(input); assign(output,'abc.out'); rewrite(output); read(a,b); c:=a+b; write(c); close(input); close(output); end. 我们运行一下,发现这两个程序的功能是一样的,因此,我们用文件类型输入输出时,一般用程序2的形式。
例:读入长方形的长和宽,求它的周长和面积。用文件类型输入输出。文件名为:cfx.pas 保留两位小数,两个数字隔一空格。 测试数据: 输入文件cfx.in: 2.5 3.6 输出文件cfx.out: 12.20 9.00 程序如下: program changfx; var a,b,c,s:real; begin assign(input,'cfx.in'); reset(input); assign(output,'cfx.out'); rewrite(output); read(a,b); c:=2*(a+b); s:=a*b; writeln(c:0:2,' ',s:0:2); close(input); close(output); end.
练习题 1.将文本文件aaa.in里面的所有内容复制到文本文件aaa.out中。 (注:使用“eof”和“eoln”函数)。 2.求每行字符的个数。(假设为两行) 输入文件为bbb.in 输出文件为bbb.out 例如: bbb.in中内容为 dfdfef Dfdfgrgrg bbb.out 中内容为 6 9 思考:若改为若干行,程序如何改?假设行数<=100行。
2.已知三角形的底a和高h的值,输出面积S。保留二位小数,用文件类型输入输出。 测试数据: 输入ga07.in: 10.5 2.0 输出ga07.out: 10.50 3.已知梯形的面积是S,高是H,上底是A,输出梯形的下底B,保留二位小数,用文件类型输入输出。 测试数据 输入文件ga08.in:分别为面积S、高H和上底A 78 20 5.2 输出文件ga08.out:下底B 2.60
4.将文本文件aaa.in里面的所有数据进行排序,并将排序结果放至文本文件aaa.out中。 5.某班一次数学测验参加考试的人数为5人,请帮助统计全班的平均成绩和每个人和平均成绩的差距。 (输入文件为MATHS.IN,一行数据依次为5人成绩,输出两行:第一行为平均成绩(小数点保留两位),第二行为每人和平均值的差(小数点保留两位))。