一、文件的定义
文件是作为Pascal程序与磁盘信息进行数据交换的一种数据类型。引入文件的目的主要有二点:
1、永久性:以文件形式储存起来的数据永久的保留在磁盘中。文件与操作它的程序相互独立,同一文件可供多个程序调用。
2、容量大:以前学习的数组、记录等数据类型在定义时受内存大小的限制,但作为存贮文件的外存(U盘或硬盘)从原理上讲是不受限制的。
在Pascal的数据文件中,数据可以按两种内部代码形式来存放:
1、按ASCII代码形式(即字符形式)存放时,这类文件称为文本文件(或正文文件),其定义形式为:
type 类型名=text;
例如:
type textf=text;
var txt:textf;
或直接写成:
var txt:text;
该定义说明了textf为名的变量对应的文件用于存放文本数据。
2、按数据的二进制代码形式存放时,这类文件称为类型文件(又称随机文件)。随机文件不具有行结构,整个文件如同一个二维数表,可由用户随机存取数据。如果再按组成类型的元素的数据结构分,又分为有类型文件和无类型文件,其定义为形式为:
type 类型名=file of 基类型; {有类型文件}
类型名=file; {无类型文件}
例如:
type intf=file of integer;
var its:intf;
或直接写成:
var itf:file of integer;
该定义说明了itf为名的变量对应的文件将用于存放整数。
又例如:
var g:file;
该定义说明了g为名的变量对应的文件的数据无任何规定。
由于目前信息学奥林匹克竞赛中评测的输入输出数据都用文本文件的格式表示,因此我们把文件的重点放在文本文件的使用上。
二、文本文件
文本文件的内容由ASCII字符集中的字符组成,因此文本文件也称ASCII码文件,它可以用DOS中的type命令列出文件的内容。文本文件具体内容由一系列行组成,每一行可以包括0个或多个字符,并以一个行结束符结尾,文本文件类型text与基类型是字符的有类型文件file of char的区别在于后者不包含行结束符(因为行结束符不能赋给char类型变量)。
正文文件可以存放不同数据类型的值,在信息学奥林匹克竞赛的题目中用得较多的是数值和字符串,不管是哪一种数据类型,在文本文件中是按同样的文本格式表示的,在文本文件内容读出时,该值的内容是由读取它的变量的类型所确定的。比如,一个文本文件中表示'8'的值可以分别赋予整型、实型或字符型变量,用read或write读写正文文件时,Pascal系统会自动按类型进行转换。
文本文件与有类型文件在读写上的差别在于前者只能按次序顺序读写,而后者可不按次序读写,因此文本文件是一种顺序文件。
用于文本文件操作的过程和函数:
1、assign过程
形式:assign(f,str);
功能:将文件名字符串str(变量或常量形式)赋给文件变量f,程序对文件变量f的操作就代替了对str表示的文件的操作。
2、rewrite过程
形式:rewrite(f);
功能:建立并打开一个新的允许写磁盘文件,其文件名必须先由assign过程赋给变量f。这时,指向文件元素的指针指向0号元素(第一个元素),rewrite过程所建立的文件为空文件。
3、reset过程
形式:reset(f);
功能:打开一个已存在的磁盘文件,其文件名必须由assign过程赋给文件变量f,该文件只允许读,文件指针指向0号元素。
4、read过程
形式:read(f,变量表);
功能:从磁盘文件f中,将数据依次读入到变量表表示的各个变量中。
5、write过程
形式:write(f,变量表);
功能:将变量表所表示的各个变量的值依次写到磁盘文件f上。
6、close过程
形式:close(f);
功能:关闭与f相关的磁盘文件,自动产生一个文件结束标志(仅在写操作时)。
7、eof函数
形式:eof(f)
功能:若文件指针指向文件尾(超过最后一个元素),则返回真值(true),否则返回假值(false)。
8、readln过程
形式:readln(f,变量表);或readln(f);
功能:从磁盘文件f中,将数据依次读至变量表的各变量中(其中readln(f)只读数据),并将文件指针移至行结束符后,即下一行的开头。
有以下等价关系:
readln(f,变量表);等价于read(f,变量表);readln(f);
9、writeln过程
形式:writeln(f,变量表);或writeln(f);
功能:将变量表所表示的各个变量的值依次写到磁盘文件f上去(其中writeln(f)不写值),然后再写一个行结束符。
有以下等价关系:
writeln(f,变量表);等价于write(f,变量表);writeln(f);
10、append过程
形式:append(f);
功能:打开一个已存在的磁盘文件,其文件名必须与assign过程中的变量名f相对应,该文件只允许写,此时的文件指针指向文件尾。
11、eoln函数和seekeoln函数
形式:eoln(f)和seekeoln(f);
功能:若文件指针指向行结束符或文件结束符,则返回真值(true),否则返回假值(false)。eoln(f)和seekeoln(f)区别在于后者返回状态时,跳过空格和制表符,主要用于读取数字值。
12、seekeof函数
形式:seekeof(f);
功能:若文件指针指向文件结束符,则返回直值(true),否则返回假值(false)。seekeof(f)返回状态时,跳过空格、制表符和行结束符,主要用于读取数字值。
三、NOIP复赛文件操作参考代码
begin
assign(input,'读入文件名');
reset(input);
assign(output,'输出文件名');
rewrite(output);
解题代码……
close(input);
close(output);
end.
例1:随机生成30个随机整数存放到文本文件ran.txt中。
var
ra:text;
i:integer;
begin
randomize;
assign(ra,'ran.txt');
rewrite(ra);
for i:=1 to 30 do writeln(ra,random(100));
close(ra);
end.
例2:将例1生成的ran.txt文件中的数据读出进行排序,然后把排好序的数据存放到文本文件snum.txt中。
var
f,g:text;
t,i,j:integer;
a:array[1..30] of byte;
begin
assign(f,'ran.txt');
reset(f);
i:=1;
while not eof(f) do begin
readln(f,a[i]);
i:=i+1;
end;
close(f);
for i:=1 to 29 do
for j:=i+1 to 30 do
if a[i]<a[j] then begin
t:=a[i];a[i]:=a[j];a[j]:=t;
end;
assign(g,'snum.txt');
rewrite(g);
for i:=1 to 30 do writeln(a[i]);
colse(g);
end.