寒假讲义——记录与文件类型
陈朝晖
一、记录
自定义数据类型,使得信息的组织与表示更加方便、灵活。
一条记录可能存在多个相关数据项。
1.记录的定义:
type 类型标识符=record
字段名1:类型1;
字段名2:类型2;
...
字段名n:类型n;
end;
如:
type
studata=record {定义记录数据类型}
num:string[6];
name:string[8];
sex:boolean;
s:array[1..5] of real;
end;
var
student:studata;{使用所定义的记录类型}
students:array[1..10] of studata;{使用所定义的记录类型}
2.记录的运用:
(1)对记录中和个域的引用,要写出记录名和域名,如:student.num {记录名、个域}
(2)开域语句:with。
{使得对记录变量各个个域的访问更加简单:P191}
with 记录名 do 语句;
或
with 记录名1,记录名2,... do 语句;
{当有多条记录名时,应注意其匹配方式:是从后往前依次进行的P199} 注意事项:
1. 在do后面语句中使用的记录的域时,只要简单地写出域名就可以了,域名前的记录变量和"."均可省略。
2. 在关键字with后面,语句可以是一个简单语句,也可以是一个复合语句。
3. 虽然在with后可以有多个记录变量名,但一般在with后只使用一个记录变量名。
二、文件
自定义数据类型,用于控制数据存取间通信。
1、标准的输入与输出。
文件是一种构造型的数据类型。在程序中都需要产生一些输出,也需要接受若干个输入。这些输入、输出实际上是用文件的方法来实现的,在Pascal中用标准文件“input”和“output”
来实现,它们分别对应标准输入设备和标准输出设备(可省略不写)这也就是一些程序的程序书写如下的原因了:
program ex(input,output);
...
2、自定义输入输出。
但有时大量数据的读入和输出都是来是磁盘文件,这就要求我们必须熟练掌握对磁盘文件的操作。
对于我们来说,我们只必须掌握文本文件(或称正文文件,text)的读写即可:
2.1、文本文件
1.文本文件的定义:
文本文件不是简单地由某类型的元素序列所组成,它的基本元素是字符,由它们构成行,若干行组成一份原文。由于各行的长度可以不同,所以文本文件只能顺序地处理。文本文件的定义如下:
var
fp:text;
2.文本文件的读操作:
(1)调用assign过程,把磁盘文件赋予文本文件变量;
assign(fp,filename);
(2)调用reset过程,为读操作做准备;
reset(fp);
(3)在需要读数据的位置调用read过程或readln过程。
readln(fp,var1,var2,...,varn);
3.文本文件的写操作:
(1)调用assign过程,把磁盘文件赋予文本文件变量;
assign(fp,filename);
(2)调用rewrite过程,为读操作做准备;
rewrite(fp);
(3)在需要读数据的位置调用write过程或writeln过程。
writeln(fp,var1,var2,...,varn);
4.文本文件的关闭操作:
close(fp);
5.文本文件的其他操作:
(1)eof(fp)—布尔函数,用于判断文件结束否。
(2)eoln(fp)—布尔函数,用于判断行结束否。
例1:下面是一个建立和使用文件的程序:
program wenjian;
const n=3; m=2;
type student=record
name:string;
score:array[1..m] of 0..100;
end;
var st:array[1..n] of student;
stfile:file of student ;
sumst:array[1..n] of integer;
sumsub:array[1..m] of integer;
sum:integer;
procedure newfile;
var i,j:integer;
begin
assign(stfile,'score.fil');
rewrite(stfile);
for i:=1 to n do
begin
writeln('Input student ',i,' name and ',m,' score'); readln(st[i].name) ;
for j:=1 to m do
read(st[i].score[j]);
readln;
write(stfile,st[i]);
end;
close(stfile);
writeln ;
writeln;
end;
procedure jisuan;
var i,j:integer;
begin
assign(stfile,'score.fil');
reset(stfile);
for i:=1 to m do sumsub[i]:=0;
for i:=1 to n do
begin
read(stfile,st[i]);
with st[i] do
begin
sumst[i]:=0;
for j:=1 to m do
begin
sumst[i]:=sumst[i]+score[j];
sumsub[j]:=sumsub[j]+score[j];
end;
end;
end;
close(stfile);
sum:=0;
for i:=1 to n do
sum:=sum+sumst[i];
for i:=1 to n do
begin
with st[i] do
begin
write(name);
for j:=1 to m do write(score[j]:6);
end;
writeln(sumst[i]:6);
end;
write('sum=');
for i:=1 to m do
write(sumsub[i]:6);
writeln(sum:8);
end;
begin
newfile;
jisuan;
end.
练习:
编写程序从磁盘上读取一个由100个实数组成的实型数据文件(indata.dat),以此文件中所有大于平均值的实数建立一个名为“above.dat”的文件,其余的建立一个名为“rest.dat”的文件。
文件数据类型使用技巧:
1.Ctrl+Enter
当鼠标移动到所指定的文件名下方时,按Ctrl+Enter组合键则可以直接打开指定文件。2.利用input,output,重新指向。
var
input,output:text;
begin
assign(input,’input.in’); reset(input);
close(input);
assign(output,’output.out’); rewrite(output);
close(output);
end.
3.文件操作在创建文件时,应注意将缓存中的数据写入到硬盘当中,否则数据将丢失,close(input)操作切忘记!尤其是程序中的一特殊处理分支的运用当中,halt,exit结束主程序前不可遗忘记。
4.文件指针不定义,直接使用pascal默认的标准文件指针,input,output。
var a,b,c:longint; {不用定义input,output}
begin
assign(input,'xx.in'); reset(input); {打开输入文件}
readln(a,b); c:=a+b; {可以省略文件指针名:input}
close(input); {关闭输入文件}
assign(output,'xx.out'); rewrite(output); {打开输出文件}
writeln(c); {可以省略文件指针名:output}
close(output); {关闭输出文件}
end.
下面的这些东西可能对你有用:
在DOS操作中,我们所谈及的文件称之为外部文件。外部文件是存储在外部设备上,如:外存储器上,可由计算机操作系统进行管理,如用dir、type等命令直接对文件进行操作。
Pascal所谈及的文件,称之为内部文件。内部文件的特点是文件的实体(实际文件)也是存储在外存储器上,成为外部文件的一分子,但在使用时必须在程序内部以一定的语句与实际文件联系起来,建立一一对应的关系,用内部文件的逻辑名对实际文件进行操作。内部文件的逻辑名必须符合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、文本文件的定义:
文本文件的类型为text,它是由ASCII字符组成的,是Pascal提供的标准文件之一。标准文件text已由Pascal说明如下:
type text=file of char;
因此,text同标准类型integer、read等一样可以直接用于变量说明之中,无需再由用户说明。
例如:
var
f1,f2:text; {这里定义了两个文本文件变量f1和f2}
2、文本文件的建立
文本文件的建立有两种方法:
(1)直接用Turbo Pascal的Edit建立原始数据文件。
例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)用程序的方式建立中间数据或结果数据文件。
用程序的方式建立文件操作步骤为:
①定义文本文件变量;
②把一外部文件名赋于文本文件变量,使该文本文件与一相应外部文件相关联;
命令格式:assign(f,name)
f为定义的文本文件变量
name为实际文件文件名
如:assign(f1,’filein.dat’) 或:assign(f1,’pas\filein.res’)
建立文件指针变量与外部文件间的关联:这样在程序中对文本文件变量F1的操作,也就是对外部实际文件’filein.dat’或’filein.res’的操作。上例中文件’filein.dat’是存贮在当前目录中,而文件’filein.res’则是存贮在pas子目录中。
③打开文本文件,准备写;
命令格式1:rewrite(f)
功能:创建并打开新文件准备写,若已有同名文件则删除再创建
命令格式2:append(f)
功能:打开已存在的文件并追加
④对文件进行写操作;
命令格式:write(f,<项目名>)
或:writeln(f,<项目名>)
功能:将项目内容写入文件f中
⑤文件操作完毕后,关闭文件。
命令格式:close(f)
3、读取文本文件
文本文件内容读出操作步骤:
①定义文本文件变量;
②用ASSIGN(f,name)命令,将内部文件f与实际文件name联系起来;
③打开文本文件,准备读;
命令格式:READ(f,<变量名表>) READLN(f,<变量名表>)
功能:读文件f中指针指向的数据于变量中
文本文件提供了另外两个命令,在文本的操作中很有用处,它们是:
EOLN(f):回送行结束符
EOF(f):回送文件结束符
⑤文件操作完毕,用CLOSE(f)命令关闭文件
4、文本文件的特点
(1)行结构
文本文件由若干行组成,行与行之间用行结束标记隔开,文件末尾有一个文件结束标记。由于各行长度可能不同,所以无法计算出给定行在文本文件中的确定位置,从而只能顺序地处理文本文件,而且不能对一文本文件同时进行输入和输出。
(2)自动转换功能
文本文件的每一个元素均为字符型,但在将文件元素读入到一个变量(整型,实型或字符串型)中时,Pascal会自动将其转换为与变量相同的数据类型。与此相反在将一个变量写入文本文件时,也会自动转移为字符型。
seekeof与eof的区别?
seekeoln与eoln的区别?
pascal 文件中不知道一行有多少元素,pascal写程序时,不知道一行有多少个元素,怎么read, 我用eoln不行啊,它好象不能在文件中用,
用seekeoln
while not seekeoln do
read...
SeekEoln和Eoln用于判断文件行结束,SeekEof和Eof用于判断文件
结束,但它们之间还是有区别的。Eoln和Eof只判断当前的所在位置
是否位于行结束符上或者文件尾部,而SeekEoln和SeekEof会自动跳
过所有连续的空格和制表符再进行判断,因此,在执行函数SeekEoln
或SeekEof后,当前的所在位置不会是空格或者制表符。
文件是一种构造型的数据类型。在程序中都需要产生一些输出,也需要接受若干个输入。这些输入、输出实际上是用文件的方法来实现的,在Pascal中用标准文件“input”和“output”来实现,它们分别对应标准输入设备和标准输出设备(可省略不写)这也就是一些程序的程序书写如下的原因了:
program ex(input,output);
...
但有时大量数据的读入和输出都是来是磁盘文件,这就要求我们必须熟练掌握对磁盘文件的操作。
对于我们来说,我们只必须掌握文本文件(或称正文文件,text)的读写即可:
1.文本文件的定义:
文本文件不是简单地由某类型的元素序列所组成,它的基本元素是字符,由它们构成行,若干行组成一份原文。由于各行的长度可以不同,所以文本文件只能顺序地处理。文本文件的定义如下:
var
fp:text;
2.文本文件的读操作:
(1)调用assign过程,把磁盘文件赋予文本文件变量;
assign(fp,filename);
(2)调用reset过程,为读操作做准备;
reset(fp);
(3)在需要读数据的位置调用read过程或readln过程。
readln(fp,var1,var2,...,varn);
3.文本文件的写操作:
(1)调用assign过程,把磁盘文件赋予文本文件变量;
assign(fp,filename);
(2)调用rewrite过程,为读操作做准备;
rewrite(fp);
(3)在需要读数据的位置调用write过程或writeln过程。
writeln(fp,var1,var2,...,varn);
4.文本文件的关闭操作:
close(fp);
5.文本文件的其他操作:
(1)EOF(fp)—布尔函数,用于判断文件结束否。
(2)EOLN(fp)—布尔函数,用于判断行结束否。
例1:下面是一个建立和使用文件的程序:
program wenjian;
const n=3; m=2;
type student=record
name:string;
score:array[1..m] of 0..100;
end;
var st:array[1..n] of student;
stfile:file of student ;
sumst:array[1..n] of integer;
sumsub:array[1..m] of integer;
sum:integer;
procedure newfile;
var i,j:integer;
begin
assign(stfile,‘score.fil‘);
rewrite(stfile);
for i:=1 to n do
begin
writeln(‘Input student ‘,i,‘ name and ‘,m,‘ score‘); readln(st[i].name) ;
for j:=1 to m do
read(st[i].score[j]);
readln;
write(stfile,st[i]);
end;
close(stfile);
writeln ;
writeln;
end;
procedure jisuan;
var i,j:integer;
begin
assign(stfile,‘score.fil‘);
reset(stfile);
for i:=1 to m do sumsub[i]:=0;
for i:=1 to n do
begin
read(stfile,st[i]);
with st[i] do
begin
sumst[i]:=0;
for j:=1 to m do
begin
sumst[i]:=sumst[i]+score[j];
sumsub[j]:=sumsub[j]+score[j];
end;
end;
end;
close(stfile);
sum:=0;
for i:=1 to n do
sum:=sum+sumst[i];
for i:=1 to n do
begin
with st[i] do
begin
write(name);
for j:=1 to m do write(score[j]:6);
end;
writeln(sumst[i]:6);
end;
write(‘sum=‘);
for i:=1 to m do
write(sumsub[i]:6);
writeln(sum:8);
end;
begin
newfile;
jisuan;
end.
练习:
编写程序从磁盘上读取一个由100个实数组成的实型数据文件(indata.dat),以此文件中所有大于平均值的实数建立一个名为“above.dat”的文件,其余的建立一个名为“rest.dat”
的文件。
{注意:类型文件用写字本或在dos模式下使用TYPE命令打开看,全是乱码(二进制代码),而文本文字由于其是以字节作编码的,很多ASCII字符编码能看明白一些!}
pascal中文件路径盘位置?
在pascal中从外部读入一个文件,那个文件存盘在哪?哪里是运行目录
一般存盘在本目录下如果你用的语句是assign(input,'xx.in')
那么xx.in 文件应该在你所指定的默认目录下
一、查看,或更改默认目录路径:
1. 运行pascal
2. 按下键盘上'ALT'+'F' 组合键
3. 在file 菜单中选中‘change dir'
4. 打开后就可以看到预定文件夹比如:e:\fp\bin\go32v2 那么,你现在从外部读入的文件就在xx.in 的路径就是e:\fp\bin\go32v2\xx.in
二、如果你使用的是绝对路径,那么你的文件就在这个绝对路径下面
如果有完整的路径
如assign(input,'e:\pascal\*');
那么*应该存在E盘的pascal文件夹下
一般保存的地方都是相对路径。
你可以自己写绝对路径的。
三、如果只有文件名
如assign(input,'cc.in');
那么cc.in应存在pascal运行目录下
如果有完整的路径
如assign(input,'e:\pascal\cc.in');
那么cc.in应该存在E盘的pascal文件夹下。
运行目录:你要进入pascal,双击的那个文件(例如turbo.exe或fp.exe)的存储目录。(即那个文件所在的文件夹)当然是真正的文件,快捷方式例外。
关于PASCAL的文件类型
1.写一个PASCAL程序,保存后目录里就会有同一文件名的四个不同类型的文件存在,分别是:.bak .exe .pas .o .这些都是什么啊?有什么用啊?我要修改保存了的程序打开哪个啊?
2.还有啊,竞赛的时候(高中NOIP)写程序常常存成一个L打头的类型(我忘了怎么写了~好象是LARZA……什么的),这个怎么解决啊?还有,是不是在LINUX环境下写的程序(在WINDOW S下)有没有什么影响啊(尤其指竞赛的时候)。
3.保存了以后,还能不能再打开成PAS那种兰色的编写界面啊?
1.
.bak文件是PASCAL的程序备份文件
.exe是PASCAL编译器(FPC)编译以后的可执行文件。
.pas是PASCAL的程序文件
.o是FPC的编译信息
.pas一般是PASCAL程序的保存文件的后缀名,程序会被PASCAL默认保存在这里,但是也有.pp这样的文件后缀名,一般LAZARUS使用.pp
2.
"LARZA……什么的"应该是LAZARUS,是NOIP官方推荐的FPC 2.0.4的Windows下的编程界面(IDE)。
Windows中的PASCAL程序与Linux中的程序不同,需要考虑字母大小写的问题,Windows 对字母大小不敏感,也就是在Windows下a和A是一样的,但是在Linux中,a和A却不一样,所以在NOIP中,一定要按照题目的要求写文件,不能随意的建立文件夹或是建立与题目不符的文件。
3.
如果想用DOS下的PASCAL IDE(也就是所谓的"PAS那种兰色的编写界面")的话,只要将.pas文件拖到fp.exe或是其他版本的PASCAL的主程序中即可。
在NOIP中一般只要求用Free Pascal和Lazarus编程,所以你应该使用的Free Pascal。它的主程序(2.0以前)一般在:X:\pp\bin\go32v2(或者win32)\fp.exe
2.0版本以后的目录在:X:\pp\bin\i386-win32\fp.exe
X是FP的安装目录