网上有好多测试数据,里面的In文件和out文件以及exe文件都是怎么回事?
怎么用呀?
网上有好多测试数据,里面的In文件和out文件以及exe文件都是怎么回事?
怎么用呀?
文件是一种构造型的数据类型。在程序中都需要产生一些输出,也需要接受若干个输入。这些输入、输出实际上是用文件的方法来实现的,在Pascal中用标准文件“input”和“output”来实现,它们分别对应标准输入设备和标准输出设备。这也就是一些程序的程序书写如下的原因了:
program exp(input,output);(可省略不写)
...
但有时大量数据的读入和输出都是来自磁盘文件,这就要求必须熟练掌握对磁盘文件的操作。
Pascal中的文件主要用于存放大量的数据。如:成绩管理,原始数据很多,使用文件先将其存入磁盘,通过程序读出文件中的数据再进行处理,比不使用文件要来得方便、有效。它的名字就是文件名。使用文件有以下几点好处:
(1)文件可以永久保存,其中的数据不会因为应用程序的结束或关机而消失。
(2)文件中的数据可以为多个应用程序所共享。
(3)文件中的数据可以多次重复使用。
(4)文件中的存放数据的数量在理论上没有限制。
Pascal中所谈及的文件,称之为内部文件。内部文件的特点是文件的实体(实际文件)也是存储在外存储器上,成为外部文件的一分子,但在使用时必须在程序内部以一定的语句与实际文件联系起来,建立一一对应的关系,用内部文件的逻辑名对实际文件进行操作。内部文件的逻辑名必须符合Pascal语言标识符的取名规则。
在Pascal语言中,文件是由一系列基本数据元素排列而成的,这些数据元素的数据类型是相同的,但通常有不同的取值。文件的基本数据元素的数据类型称为文件的基类型。文件中所含的数据元素的个数称为文件的长度。文件的长度和文件所占有的字节数可能不同。文件中元素的个数即文件的长度不是固定不变的。用于暂时存放文件中的数据的内存区称为文件缓冲区。对于文件的操作至少要由以下5个过程:
(1)说明文件类型,定义文件标识符;
(2)建立内部文件与外部文件的联系;
(3)打开文件;
(4)对文件进行操作;
(5)关闭文件。
按照对文件的读写方式,可以把文件分为顺序文件和随机文件。顺序文件的特点是对文件的读或写操作都只能按文件中元素的顺序,所以顺序文件的读和写不能交叉进行。随机文件的特点是可以直接对文件中某个元素进行读或写,而不需要先对它前面的元素作相同的操作。对于随机文件的读和写可以交叉进行。
Pascal语言中,按照文件的存储方式可以把文件分为文本文件和类型文件。若文件中的数据都是以ASCII码形式存储的,则这种文件称为文本文件。若文件中的数据都是以非ASCII码形式存储的,则这种文件称为类型文件。Pascal中文本文件都是顺序文件,类型文件都是随机文件。
文本文件
文本文件又称为正文文件或行文文件,可以直接阅读,是人机通信的基本数据形式之一。文本文件的内容由ASCII字符集中的字符组成,因此文本文件也称ASCII码文件。文本文件具体是由一系列行组成,每一行可以包括0个或多个字符型成分,并以行结束符结尾。文本文件可用文字编辑程序(如Free Pascal的编辑窗口中或记事本中)直接建立、阅读和修改, 也可以由Pascal程序在运行过程中建立。
一、文本文件的定义
文本文件的类型为text,它是由ASCII字符组成的,是Pascal提供的标准文件之一。标准文件text已由Pascal说明如下:type text=file of char;因此,同标准类型integer、real等一样可以直接用于变量说明之中,无需再由用户说明。 例如:
var f1,f2:text;
这里定义了两个文本文件变量f1和f2。
二、文本文件的建立
文本文件的建立有两种方法:一是直接用Free Pascal的Edit建立原始数据文件;二是用程序的方式建立中间数据或结果数据文件。
例如将下表中的数据存入名为A.dat的文件中。
3 4
29 30 50 60
80 90 70 75
60 50 70 45
操作步骤:进入Free Pascal的编辑状态;输入数据;存盘,文件名取A.dat。
此时,已将数据存入文本文件A.dat中。文本文件也可用记事本等文本编辑器在windows下建立。
如果用程序的方式建立文件,操作步骤为:
1、定义文本文件变量;
2、把一外部文件名赋于文本文件变量,使该文本文件与相应外部文件相关联;
命令格式:assign(f,name)
f为定义的文本文件变量,name为实际文件文件名
如:assign(f1,'filein.in') {相对路径}
或:assign(f1,'d:\pas\fileout.out') {绝对路径}
这样在程序中对文本文件变量f1的操作,也就是对外部实际文件'filein.in'或'fileout.out'的操作。上例中文件'filein.in'是存贮在当前目录中,而文件'fileout.out'则是存贮在d:\pas\子目录中。
3、打开文本文件,写准备;
命令格式:rewrite(f)
功能:创建并打开新文件准备写,若已有同名文件则删除再创建。
4、对文件进行写操作;
命令格式:write(f,<项目名>)或:writeln(f,<项目名>)
功能:将项目内容写入文件f中
5、文件操作完毕后,关闭文件。
命令格式:close(f)
例11.1 从键盘输入下列数据,然后用程序写入名为B.dat的文件中。
3 4
29 30 50 60
80 90 70 75
60 50 70 45
program exp11_1;
var i,j,n,m,x:integer;
f:text;
begin
write('n,m=');
readln(n,m);
assign(f,'b.dat');
rewrite(f);
writeln(f,n,' ',m);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(x);
write(f,x,' ');
end;
readln;writeln(f);
end;
close(f);
end.
三、读取文本文件
文本文件内容读取操作步骤:
1、定义文本文件变量;
2、用assign(f,name)命令,将内部文件f与实际文件name联系起来;
3、打开文本文件,读准备;
命令格式:reset(f)
功能:打开一个已经存在的磁盘文件,该文件只能读,指向文件元素的指针指向第一个元素。
4、对文件进行读操作;
命令格式:read(f,<变量名表>) 或readln(f,<变量名表>)
功能:读文件f中指针指向的数据于变量中。
5、文件操作完毕,用close(f)命令关闭文件。
例11.2 读出例1生成的文本文件B.dat中的内容,并输出到屏幕。
program exp11_2;
var i,j,n,m,x:integer;
f:text;
begin
assign(f,'b.dat');
reset(f);
read(f,n,m);
writeln(n,' ',m);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(f,x);
write(x,' ');
end;
writeln;
end;
close(f);
readln
end.
由于文本文件是以ASCII码的方式存储,故查看文本文件的内容是极为方便,在windows状态可使用记事本等软件进行查看,在Free Pascal中可以象取程序一样取出文件进行查看。
四、文本文件的特点
1、行结构
文本文件由若干行组成,行与行之间用行结束标记隔开,文件末尾有一个文件结束标记。由于各行长度可能不同,所以无法计算出给定行在文本文件中的确定位置,从而只能顺序地处理文本文件,而且不能对一文本文件同时进行输入和输出。
2、自动转换功能
文本文件的每一个元素均为字符型,但在将文件元素读入到一个变量(整型,实型或字符串型)中时,Pascal会自动将其转换为与变量相同的数据类型。与此相反在将一个变量写入文本文件时,也会自动转移为字符型。
五、例题分析
例11.3 某学习小组有10人,参加某次测验,考核6门功课, 统计每人的总分及各门的平均分,将原始数据及结果数据放入文本文件中。
分析
(1)利用Free Pascal的edit建立原始数据文件textin.txt存贮在磁盘中,其内容如下:
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)建立结果数据文件,文件名为textout.txt。
program exp11_3;
var
f:text;
i,j,n,m,s:integer;
data:array[1..11,0..7] of integer;
p:array[1..6] of integer;
procedure data_in;
var i,j:integer;
begin
assign(f,'textin.txt');
reset(f);
read(f,n);readln(f,m);
for i:=1 to n do
for j:=0 to m do
read(f,data[i,j]);
close(f);
end;
procedure data_out;
var i,j:integer;
begin
assign(f,'textout.txt');
rewrite(f);
for i:=1 to n do
begin
for j:=0 to m+1 do
write(f,data[i,j]:4);
writeln(f);
end;
write(f,' ');
for j:=1 to m do
write(f,p[j]:4);
writeln(f);
close(f);
end;
begin
data_in;
fillchar(p,sizeof(p),0);
for i:=1 to n do
begin
s:=0;
for j:=1 to m do
begin
s:=s+data[i,j];
p[j]:=p[j]+data[i,j];
end;
data[i,m+1]:=s;
end;
for i:=1 to n do
begin
for j:=0 to m+1 do
write(data[i,j]:4);
writeln;
end;
write(' ');
for j:=1 to m do
begin
p[j]:=p[j] div n;
write(p[j]:4);
end;
writeln;
data_out;
end.
例11.4 读入一个行长不定的文本文件。排版,建立一个行长固定为60个字符的文件, 排版要求:(1)当行末不是一个完整单词时,行最后一个字符位用'-'代替, 表示与下一行行头组成完整的单词;(2)第一行行头为两个空格,其余各行行头均不含有空格。
分析
(1)建立原始数据文件。
(2)程序边读入原始数据文件内容,边排版。因为行长和文件长度不固定,所以要使用下面函数:
eoln函数
形式:eoln(f);
功能:若文件指针指向行结束符或文件结束符,则返回true,否则返回false。
eof函数
形式:eof(f);
功能:若文件指向文件尾,则返回true,否则返回false。
(3)每排完一行行长为60字符,并符合题中排版条件,写入目标文件中。
设原始数据copy.in文件内容如下:
Pavel was arrested.
That dat Mother did not light the stove.
Evening came and a cold wind was blowing.
There was a knock at the window.
Then another.
Mother was used to such knocks,but this time she gave a little start of joy.
Throwing a shawl over her shoulders,she opened the door.
program exp11_4;
const
maxlen=60;
var
f1,f2:text;
ch,ch1:char;
s:string[maxlen];
i,j:integer;
inname:string[20];
begin
write('enter textin filename');
readln(inname);
assign(f1,inname);
reset(f1);
assign(f2,'copy.out');
rewrite(f2);
j:=0;s:=' ';
while not eof(f1) do
begin
while not eoln(f1) do
begin
inc(j);
read(f1,ch);
if j=maxlen+1 then
case ch of
' ':begin writeln(f2,s);s:='';j:=0; end;
'.':begin writeln(f2,s);j:=1;s:=ch; end
else
begin
ch1:=s[60];
if s[59]=' ' then s[60]:=' ' else s[60]:='-';
writeln(f2,s);j:=2;s:=ch1+ch;
end;
end
else s:=s+ch;
end;
readln(f1);
end;
writeln(f2,s);
close(f1);
close(f2);
end.
对copy.in文本文件运行程序得到排版结果文件copy.out内容如下:
Pavel was arrested.That dat Mother did not light the stov-
evening came and a cold wind was blowing.There was a knock
at the window.Then another.Mother was used to such knocks,b-
ut this time she gave a little start of joy.Throwing a shawl
over her shoulders,she opened the door.
这就是测试数据,in 文件就是输入文件,out 文件自然就是输出文件了,用起来就是在运行时输入的是输入文件,输出的是输出文件,只要加上
assign(input,'文件名.in');
reset(input);
assign(output,'文件名.out');
rewrite(output);
最后别忘了在程序末尾加上
close(input);close (output);