FREE PASCAL入门文件输入与输出Word文档下载推荐.docx
《FREE PASCAL入门文件输入与输出Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《FREE PASCAL入门文件输入与输出Word文档下载推荐.docx(12页珍藏版)》请在冰点文库上搜索。
{关联文件变量f到一个外部文件data.out}
rewrite(f);
{以新建写文件的方式打开文件}
randomize;
{设置随机种子}
s:
=0;
{统计变量清零}
fori:
=1tondo
begin
a:
=random(1001);
{产生随机数}
write(f,a:
5);
{将随机数写到文件里}
ifimod10=0thenwriteln(f);
{每写10个数换一行}
ifa>
=500thens:
=s+1;
{统计>
end;
close(f);
{关闭文件}
write('
>
=500:
'
s);
{在屏幕上打印>
=500的数的个数s}
end.
【相关知识】
1.pascal程序中写文件的5个步骤
在Pascal程序重创建文件并写入数据要经历5个步骤,即:
定义文件变量、关联、写准备、写数据、关闭文件变量。
①定义:
在变量说明部分定义文件变量,变量名自己取,类型定义为text型。
②关联:
将一外部磁盘文件名赋于文本文件变量,使该文本文件与一相应外部磁盘文件相关联。
命令格式为:
assign(f,name)
其中f为定义的文本文件变量,name为实际磁盘上文件的文件名
如:
assign(file1,'
fileout.dat'
)
或:
assign(f1,'
e:
\aq2006\a1.out'
)
磁盘文件如包含路径,如'
,则表示将文件存放到e:
\aq2006文件夹中,文件名为a1.out,如果不加路径,则存放在pascal工作目录中,如果工作目录没有更改,FreePascal默认的工作目录一般为“C:
\”。
经过关联后,在程序中,如果对文本文件变量file1或f1的操作,也就是对外部实际磁盘文件fileout.dat或e:
\aq2006\a1.out的操作。
③写准备:
如果要向文件中写入数据,则在写入数据之前应先以写入方式打开。
具体的写打开方式有两种:
命令格式1:
rewrite(f)
功能:
创建并打开新文件准备写,若已有同名文件则删除再创建
命令格式2:
append(f)
打开已存在的文件并追加
④写数据:
写入数据时,就使用输出语句write和writeln语句,写入的效果就如同将屏幕上的数据原样写入文件中。
只是在使用这两条语句时,必须先使用文件变量指明写入对象。
如:
Write(f,s)或writeln(file1,a(5),a(6))
前者含义为向文件f中写入变量s的值,后者的含义为向文件file1写入数组变量a(5)、a(6)的值。
注意,这些数据实际上是写入这些文件变量所关联的磁盘文件中。
⑤关闭:
文件写完后,必须关闭,关闭的格式为:
Close(f),即关闭文件变量f。
2.查看文本文件
由于文本文件是以ASCII码的方式存储,故查看文本文件的内容是极为方便,在DOS状态可使用DOS中TYPE等命令进行查看,在Pascal中可以象取程序一样取出文件进行查看。
而在windows操作系统中,最方便的方法是按下键盘上空格键两边的windows键,切换到桌面,再找到刚才程序生成的数据文件,用记事本查看该数据文件的内容,如图1.1图4.1所示的就是用记事本打开示例数据文件的效果。
图4.1
用记事本打开数据
3.文本文件的特点
①行结构
文本文件由若干行组成,行与行之间用行结束标记隔开,文件末尾有一个文件结束标记。
由于各行长度可能不同,所以无法计算出给定行在文本文件中的确定位置,从而只能顺序地处理文本文件,而且不能对一文本文件同时进行输入和输出。
②自动转换功能
文本文件的每一个元素均为字符型,在将一个变量写入文本文件时,也会自动转移为字符型。
与此相反,在将文件元素读入到一个变量(整型,实型或字符串型)中时,FreePascal会自动将其转换为与变量相同的数据类型。
4.计算机自动生成随机数
随机数是计算机程序中方便获得大量模拟数据的一个重要手段。
在pascal中,可以利用random函数自动生成随机数,其格式为:
random(range)
不指定range时,结果是[0,1]之间的随机实数([0,1]表示≥0并且≤1)。
如果指定了range,range必须是整型表达式,结果为[0,range]之间的随机正整数,如果range为0则,返回0。
随机数产生程序由randomize命令初始化,因此在使用random函数之前,应先使用randomize命令进行随机种子的初始化。
【同步练习】
1.已知斐波那契(faibonacci)数列的前几个数分别是0、1、1、2、3、5、8……,编写程序求此数列的前100项,并将前100项输出到一个文件中。
问题分析:
此问题的解决利用以前章节所学的知识完全可以解决,只要掌握斐波那契数列从第3项开始,任意一项的值等于前两项值的和,即:
F(n)=F(n-1)+F(n-2)
需要注意的是循环的次数要控制准确,因为第1项是从0开始的,而不想通常的题目是从1开始的。
本题中练习的重点是如何将这些数输入到文件中,只要掌握的血文件的基本要领,本题是不难完成的。
程序设计:
略
2.照使用pascal语言程序写文件的步骤有如下5步,请将它们正确排序:
①用write或writeln向文件中写入数据。
②用close命令关闭文件。
③在程序说明的var区用text类型标志定义一个文件变量。
④用rewrite或者用append命令以新建或追加方式打开文件,准备存放数据。
⑤用assigh命令设定要操作的磁盘文件。
正确的步骤是:
__________________________________
第2节对文件中的数据进行排序
在上一课由程序生成的文件data.out中,读入500个随机数,将它们排序后存放到datasort.out中。
本例中先要打开data.out文件,将其中的数据读入到一个数组中,然后进行排序,最后将排序的结果输出到文件datasort.out中。
只要认真仔细的按照文件数据的读取和写入的步骤来编程,程序的实现应该是不成问题的。
Programp4_2(input,output);
i,j,p,t:
f1,f2:
{定义f1、f2为文本文件变量}
a:
array[1..n]ofinteger;
{定义数组a}
assign(f1,'
{关联文件变量f1到外部文件data.out}
reset(f1);
{复位文件指针,以读方式打开文件}
=1tondoread(f1,a[i]);
{读入数据存放到数组a中}
close(f1);
=1ton-1do{选择法排序}
begin
p:
=i;
forj:
=i+1tondo
ifa[j]<
a[p]thenp:
=j;
t:
=a[i];
a[i]:
=a[p];
a[p]:
=t;
end;
assign(f2,'
datasort.out'
{关联文件变量f2到输出文件datasort.out}
rewrite(f2);
{以新建写文件的方式打开文件f2}
write(f2,a[i]:
{将数组中的数依次写到文件里}
ifimod10=0thenwriteln(f2);
{每写10个数换一行}
close(f2);
程序运行后,用记事本程序打开datasort.out文件,可以看到排列好的数据如图4.2所示。
图4.2
排序后的数据文件内容
1.pascal程序中读文件的5个步骤
在Pascal程序中读入也要经历5个步骤,即:
定义文件变量、关联磁盘文件、读准备、读数据、关闭文件变量。
定义文件变量、关联磁盘文件、关闭文件变量等几步和写文件操作类似,这里就不再赘述了。
读准备是在读数据之前,先以读方式,复位文件指针,命令格式是reset(文件变量)。
读数据时,就使用读语句read和readln语句。
和写文件数据一样,读数据时也要指定从那个文件变量中读入数据。
read(f,s)或readln(file1,a(5),a(6))
即从文件f中读入数据,赋值给变量s;
从文件file1中读入两个数据,赋值给数组变量a(5)、a(6)。
以读文件方式时打开文件时,实际上有一个文件指针指向第1个数据,读完一个数据后,指针自动指向下一个数据,当程序中再有读数据操作时,将读入指针所指的数据。
碰到readln语句时,读完readln语句所需数据后,文件指针自动换行,指向下一行的第1个数据。
2.与文本文件相关的函数:
与文本文件相关的函数有两个,即eof(f)和eoln(f),它们的含义是:
(1)eof(f)—布尔函数,用于判断文件结束否。
其中f是文件变量,函数的返回结果为true时,表示到达文件尾,反之则未到文件尾。
eof是endoffile的缩写。
(2)eoln(f)—布尔函数,用于判断行结束否。
其中f是文件变量,函数的返回结果为true时,表示到达本行结尾,反之则未到行尾。
eoln是endofline的缩写。
1.现有两个已经按从小到大排好序的整数文件f1和f2,请编写程序将f1和f2合并成一个文件f12,使得合并后的文件也是按从小到大排好序的。
解决本题需要处理好以下几个方面的问题。
①本文题涉及到同时对三个文件的操作,同时从f1和f2中读取数据,再向f3中写数据。
只要思路清晰,文件的读写部分难度不大。
②由于数据量不定,读取数据用while循环,循环的条件由eof(f)函数来控制。
③合并的算法可以采用如下思路:
先从f1和f2各读一个数a1、a2,比较大小,将小的(假如a2小)写入f3;
接着再在f2中读一个数,跟a1比,小的写入f3,依此类推,直到某个文件中的数读完,再将另外一个文件中剩下的数依次写入f3。
这个算法就好像两个已经按高矮排好队的队列合并成一个新队列一样。
请你想象一下就会明白这个算法的思路了。
2.编写一程序,计算英文文章文本文件中,字母e出现了多少次。
3.编写一程序,统计一个文本文件f中共有多少行和多少字符。
4.编写程序从磁盘上读取一个由100个实数组成的实型数据文件(indata.dat),以此文件中所有大于平均值的实数建立一个名为“above.dat”的文件,其余的建立一个名为“rest.dat”的文件。
第3节利用文件测试程序
某学习小组有10人,参加某次测验,考核6门功课,统计每人的总分及各门的平均分,将原始数据及结果数据放入文本文件中。
本文题的程序设计部分所涉及的知识都是前面学习过的文件知识,这里主要是讨论如何编写制作测试数据来检验程序的正确性。
利用Windows的“记事本”程序建立原始数据文件textin.dat存贮在磁盘中,其内容如下:
106
1788967909867
2909386848693
3938578897898
4678976679874
5837592788974
6765789847371
7819374767886
8688391837889
9637183947895
10789990808670
程序读入原始数据文件,求每人的总分及各门的平均分;
同时建立结果数据文件,文件名为textout.dat。
programp4_3(input,output);
f:
i,j,n,m,s:
data:
array[1..11,0..7]ofinteger;
p:
array[1..6]ofinteger;
begin
assign(f,'
textin.dat'
{从文本文件中读取数据}
reset(f);
read(f,n);
readln(f,m);
forj:
=0tomdo
read(f,data[i,j]);
close(f);
fillchar(p,sizeof(p),0);
{将数组p中元素全部赋值为0}
fori:
s:
forj:
=1tomdo{求每人总分,各科总分}
=s+data[i,j];
p[j]:
=p[j]+data[i,j];
end;
data[i,m+1]:
=s;
=1tondo {显示输出数据}
=0tom+1do
write(data[i,j]:
4);
writeln;
write('
'
=1tomdo{求各科平均分}
=p[j]divn;
write(p[j]:
textout.dat'
{将数据写入文件}
rewrite(f);
write(f,data[i,j]:
writeln(f);
write(f,'
=1tomdo
write(f,p[j]:
writeln(f);
end.
1.手工测试的问题
实际上,我们在未使用文件来编写程序时,通过read语句输入数据时,可以在运行过程中换用不同的数据来测试程序,但是有些程序往往无法手工进行测试,这是由于有时数据量较大时,手工输入测试费时费力,而且容易出错,像本例中要测试一组数据要输入60个数据,非常麻烦;
还有的时候,由于数据量太大,根本无法手工完成测试数据,比如,本章第1课中测试一组数据要500个数据,手工测试几乎不可能。
因此,必须使用文件来测试程序
2.测试文件的制作
程序所需测试数据文件的制作一般采用两种方法,一是利用“记事本”程序手工编写的方法,另一种是利用程序来自动生成。
本章第2课问题中测试一组数据要500个随机数,这种情况往往需要另外编写一段程序来自动生成。
这里我们重点讨论第1种方法。
“记事本”程序是Windows自带的文本文件编辑程序,利用它可以快速的编写我们想要的数据文件。
具体的操作步骤是:
①按键盘上空格键两边的“Windows”键,切换回桌面。
②进入需要建立测试数据的文件夹,如“2005pas”,按如错误!
未找到引用源。
所示操作,使Windows显示文件的扩展名。
图4.3
显示文件的扩展名
③在“2005pas”文件夹中,按如图4.4所示操作,建立文本文件,并改名为“textin.dat”。
图4.4
建立文本文件
④新建的文件默认文件名为“新建文本文档.txt”,右击该文件,选择“重命名”菜单,按如所示操作,将文件改名为程序所需的测试文件名,如“textin.dat”。
在出现“可能会导致文件不可用”提示时,确认更改。
图4.5
修改文件扩展名
⑤按住键盘上的Shift(上档)键不放,右击该文件,选择“打开方式”菜单命令,在弹出的“打开方式”对话框中按如图4.6A所示操作,将该文件关联到“记事本”程序。
A调整打开方式B输入数据
图4.6
制作测试文本文件
⑥双击该文件,在打开的记事本界面中输入测试数据,最后选择“文件”→“保存”菜单命令保存。
⑦单击桌面底端任务栏上的freepascal程序,修改好程序中调用测试文件的路径和文件名,运行程序,测试程序的正确性。
1.有两个文本文件name.in和age.in,两个文件的行数相同,其中第1个文件中每行是人名,第2个文件中每行是年龄。
编写一程序生成一个新的文件info.out,它的每一行由name.in人名和age.in年龄的对应行数据组成。
利用记事本事先制作好name.in和age.in这两个测试文件