代码改变世界

文件处理

2009-12-03 18:36  HYrz的菜园子  阅读(434)  评论(0编辑  收藏  举报

一、文件的概念

1、概念和特点:
    Pascal所谈及的文件,称之为内部文件。内部文件的特点是文件的实体(实际文件)也是存储在外存储器上,但在使用时必须在程序内部以一定的语句与实际文件联系起来,建立一一对应的关系,用内部文件的逻辑名对实际文件进行操作。
Pascal中的文件主要用于存放大量的数据。如:成绩管理,原始数据很多,使用文件先将其存入磁盘,通过程序读出文件中的数据再进行处理,比不使用文件要来得方便、有效。
 
  Pascal中,文件定义为同一类型的元素组成的顺序集合。文件中的各个元素按一定顺序排列,可以从头至尾访问每一个元素。从定义上看,文件与数组相似,但它们之间有着明显不同的特征,主要表现在:
  1、文件的每一个元素顺序存贮于外部文件设备上(如磁盘上)。因此文件可以在程序进行前由Pascal程序或用文字编辑软件,或在运行过程中由程序产生,且运行完后,依然存贮在外部设备上。
  2、在系统内部,通过文件指针来管理对文件的访问。文件指针是一个保存程序在文件中位置踪迹的计算器,在一固定时刻,程序仅能对文件中的一个元素进行读或写的操作,在向文件写入一个元素或从文件读取一个元素后,相应的文件指针就前进到下一元素位置。而数组是按下标访问。
  3、在文件类型定义中无需规定文件的长度即元素的个数,就是说元素的数据可动态改变,一个文件可以非常之大,包含许许多多元素,也可以没有任何元素,即为一个空文件。而数组的元素个数则是确定的。
  
2、文件的分类
    Turbo Pascal中,按照文件的结构形式可将文件分为三类:文本文件(顺序)、类型文件和无类型文件。
文本文件又称为text文件或正文文件,文件的内容以字符形式(ASCII码)存放的。文本文件可用文字编辑程序(如windows记事本、Turbo Pascal的编辑命令edit)直接建立、阅读和修改,也可以由Pascal程序在运行过程中建立。
类型文件又称file文件、二进制文件,它的内容以二进制代码形式存放的。
按照文件的存取方式将文件分为顺序存取文件和随机存取文件。顺序文件的读写都要从文件头顺次进行,而随机文件可以从文件的任意指定位置读写。
Pascal文本文件属于顺序存取文件,而类型文件属于随机存取文件。
顺序文件特征:
1)      总是从文件的起始位置开始把数据输出(写)到文件中去;输出的数据一个接一个地存放在文件中。
2)      也总是从文件的起始位置开始把数据输入(读取)到内存;读数据也按存入文件时的顺序一个接一个地读入到内存中。
3)      对一个文件的读写操作不能交差进行。
 
3、文件处理的标准过程和标准函数(下面的描述,f表示一个文件变量。)
   Text文件的过程或函数:
Ø       assign(f,str):str是合法文件名的字符串表达式,把其赋值给f,以后对f的操作即对文件str的操作。
Ø       reset(f):打开一个已存在的文件,并把指针指向文件的开始位置。
Ø       rewrite(f):创建一个新的文件,并以写的方式打开该文件。
Ø       readln(f):指针指向下一行的开始位置。
Ø       writeln(f,var1,var2,…,varn):往文件写入变量的值,然后再写一个行结束符。

Ø       append(f):以写的方式打开一个已存在的文本文件,指针指向文件尾,可用Write语句给文件填加新内容。Rewrite打开的文件是空文件,而Append不破坏被打开的文件。
Ø       eof(f) :当文件指针指向文件结束符,Eof(f) 的值为True,否则为False。
Ø       eoln(f):用Eoln(f)可判断是否到了文件f某行的末尾,若是则Eoln(f)的值为True,否则为False。这个行结束符不能读给一个变量,应用Readln(f)跳过它,而用Writeln(f)可在文件f的某位置得到行结束符。
 
二、文件的操作
    文本文件中引入行的概念,它由一系列行组成,行与行之间用行结束标记隔开,最后有一个文件结束标记。
 
1、文本文件的操作步骤:
  ①文件使用前,必须对文件类型和文件标识符进行说明;
var f1,f2:text;
 
  ②建立程序中的文件(内部文件)与磁盘上实际文件(外部文件)联系;
assign(filevar,filename);
filevar是文件变量,在变量说明部分预先定义;filename 是合法文件名的字符串表达式,把其赋值给filevar,以后对filevar的操作即对文件filename的操作。如:assign(f1, 'input.txt');
 'input.txt'是实际文件名,默认在Turbo Pascal安装目录下,也可使用文件的绝对路径。如: assign(f1, 'a:\input.txt');
也可用read语句读入filename:
如: read(filename);
     assign(f2, filename);
  
③打开文件,将指针指向开始位置;
rewrite(filevar):创建一个新的磁盘文件,并以写的方式打开该文件,将指针指向开始位置。
write(filevar,var1,var2,…,varn);
向文件filevar写入变量var1,var2,…,varn的值,每向文件写入一个数据,指针指向下移一个位置。
append(filevar);
以写的方式打开一个已存在的文本文件,指针指向文件尾,可用write语句给文件填加新内容。rewrite打开的文件是空文件,而append不破坏被打开的文件。
 
  ④对文件进行读、写操作:
reset(filevar);打开一个已存在的文件,并把指针指向文件的开始位置。
read(filevar,var1,var2,…,varn);
从文件filevar读取若干数据,分别赋值于var1,var2,…,varn。每读取一个数据,指针指向下移一个位置。
readln(filevar,var1,var2,…,varn); 指针指向下一行的开始位置。读取若干数据,分别赋值于var1,var2,…,varn。每读取一个数据,指针指向下移一个位置。
 
  ⑤使用文件后,一定要关闭文件。
  close(filevar);读、写完毕后,必须关闭文件,以保证文件的完整性和可靠性。
 
例1、参赛信息输出(99’安徽省赛第0题)
    请向文件中依次输出以下三行信息:
      *** Ⅰ ***
        XXX
      Your name
    其中XXX为参赛号,Your name为你的汉语拼音名。
    var f:text;
    begin
      assign(f, 'lx12_1.out'); rewrite(f)
      writeln(f,'*** 1 ***');
      writeln(f,'19990101');
      writeln(f,'Cornell');
      close(f);
   end.
 
例2、从键盘上输入一段正文,用程序写入指定的文件中,并在显示器输出。

var c:char;
str:string[20];
f:text;
begin
write('input a file name:'); readln(str); { 输入文件名,建立新文件}
assign(f,str);            { 将内部变量名与外部文件建立关联 }
rewrite(f);               { 以写状态打开该文件 }
while not eof do          { 文件结束标志Ctrl+z }
 begin
while not eoln do     { 行未结束继续写 }
 begin read(c); write(f,c) end;
readln;
writeln(f)            { 写一个行结束符到文件中 }
end;
close(f); writeln;             
reset(f);                   { 以读状态再次打开该文件 }
while not eof(f) do         { 读取数据,直到文件结束符为止 }
begin
while not eoln(f) do    { 读取一行数据 }
begin read(f,c); write(c:3) end;
readln(f);            { 读到回车换行符换一行继续读 }
writeln               { 屏幕换行 } 
end;
close(f)
end.
 
2、类型文件的操作步骤:
类型文件只能存放一种类型的数据,而文本文件可以包含多种数据类型的数据项。
  ①类型文件的定义(合并定义)
var f1,f2:file of integer;
  ②用assign过程外部文件与文件变量(内部文件)联系;
③调用rewrite或reset过程将文件打开;
④用read命令进行读操作;用 write命令进行写操作;
file 类型文件没有行的概念,类型文件中不允许使用readln 和writeln过程;也不能使用eof函数。
filepos(filename)函数返回指定文件的当前指针; filesize(filename)函数返回指定文件的当前长度(文件元素个数)。
file文件是随机文件,seek(filename,位置值/算术表达式)过程提供指针定位。
⑤文件操作完毕,用close过程关闭所有文件。
 
练习:
1、产生20个100以内的随机正整数,存放在文本文件file1中,再从文件中读取所有数据进行排序,并将排好序的数存放在文本文件file2中,最后将文件file2中的数据在屏幕输出。