文档库 最新最全的文档下载
当前位置:文档库 › 090112记录与文件类型

090112记录与文件类型

寒假讲义——记录与文件类型

陈朝晖

一、记录

自定义数据类型,使得信息的组织与表示更加方便、灵活。

一条记录可能存在多个相关数据项。

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的安装目录

相关文档