190 likes | 431 Views
文件变量于数据文件联系的方法各种不同的编程语言有不同的方法,在我们所学的 TURBO PASCAL 中用一个 过程: ASSIGN 来实现。 使用方法: ASSIGN (变量名,‘文件名’) 注意:文件名必须要用单引号引起来,同时可以使用路径。 比如数据文件 ABC 。 DAT 放在 D 盘根目录下,变量是 A ,那么就要这样写: ASSIGN ( A ,’ D : ABC 。 DAT’ )。 这是绝对路径的写法,也就是前面有什么盘,比如说 D 盘。
E N D
文件变量于数据文件联系的方法各种不同的编程语言有不同的方法,在我们所学的TURBO PASCAL中用一个过程:ASSIGN来实现。 使用方法:ASSIGN(变量名,‘文件名’) 注意:文件名必须要用单引号引起来,同时可以使用路径。 比如数据文件ABC。DAT放在D盘根目录下,变量是A,那么就要这样写: ASSIGN(A,’D:\ABC。DAT’)。 这是绝对路径的写法,也就是前面有什么盘,比如说D盘。 也有相对路径的写法,比如执行程序和数据文件在一个文件夹里,那么就可以这样写:ASSIGN(A,’ABC。DAT’)。
ASSIGN(A,’ABC。DAT’)的意思: ASSIGN:指定。 指定变量A与文件 ABC。DAT联系,或者说指定变量A与文件 ABC。DAT联系相对应。 那么以后如果想从文件中拿数据,就是从变量A中那数据,如果想把数据存到文件中,就直接把数据赋值给变量A就可以了。 一旦文件变量与文件建立联系后,有了ASSIGN语句后,就不要再使用文件名了 ,所有的操作都变成了对变量进行操作。 注意: ASSIGN语句最好放在程序的开头,而且ASSIGN是一个过程,要单独作为一句话。
13、2、2 文件的打开与关闭 从上面所学的已经看出,从数据文件里读数据比从键盘上读数据要麻烦的多,这因为数据文件本身并不是程序的一部分,与程序也没有任何关系,程序要使用它必须通过文件变量来作为中介,并且还有一定的手续,这个手续就是打开文件和关闭文件。 也就是说使用文件之前要打开它,使用后还要关闭它,不能一走了之。打开文件的命令是:RESET、REWRITE,关闭文件是CLOSE。这三个命令都是过程,要单独作为一个语句使用。 下面讲讲这三个过程的区别。
(1)、打开文件:REWRITE过程的使用方法: REWRITE(文件类型变量); 这是以写的方式打开一个文件,也就是说这个过程功能打开一个文件,并且准备往文件里存数据。如果原来磁盘上没有这个文件将首先自动一个这样的文件;如果原来磁盘中就有了一个这样文件,则先把文件里的所有数据全部清空,再准备往文件里存数据。 在301页讲了文件按存取方式不同可分为:顺序存取文件和直接存取文件(或随机存取文件),注意这两种文件的区别。 (文本文件是顺序文件,类型文件和无类型文件是随机文件) 这个命令对所有的文件产生的效果都是一样的,顺序文件以写的方式打开后就只能进行写,因为顺序文件不能同时进行读写操作;随机文件虽然可以同时进行读写,但因为刚开始文件里没有任何数据,即使原来有也会先被清空,所以进行读就没有意义。也就是说:这个命令是准备往文件里写数据。
(2)、打开文件:RESET过程的使用方法: RESET(文件类型变量); 这个过程对于顺序文件和随机文件是有区别,与REWRITE不一样。对于顺序文件,是以读的方式打开文件,也就是说,只能从文件读数据出来,不能往里面写数据,因为顺序文件不允许同时进行读写;对于随机文件,则可读可写,因为随机文件允许同时进行读写。 此过程与REWRITE还有一点不一样,磁盘中必须存在一个文件,如果没有它不会自动建立一个,而是会发生输入/输出错误。而且原来文件里如果有数据,这个过程不会破坏原文件中的数据。
由以上可以看出REWRITE与RESET的区别: 1、REWRITE应该是往数据文件里写数据,如果原来的数据文件不存在就会自动建立一个,如果有的话就先把原文件清空再准备写。而RESET则要求原文件必须存在,如果没有就会出错,因为它主要功能是读; 2、REWRITE是以写的方式打开顺序文件,对于随机文件可以进行读写,但因为会把原文件清空,所以读就没有意义,也相当于写。RESET是以读的方式打开顺序文件,而对于随机文件可以进行读写操作。 3、注意对顺序文件和随机文件的操作区别; 同时进行读写的含义:也就是说打开文件,你可以第一个语句读,第二个语句写。不能同时进行读写的含义:你以写的方式打开就不能读,如果你想读的话就必须先关闭文件,然后再以读的方式打开。当然这是针对顺序文件而言的。
3、关闭文件 ;CLOSE过程的使用方法: CLOSE(文件类型变量); 关闭在本程序中打开的文件,有些语言会自动关闭,但在TURBO PASCAO中必须人为关闭已打开的文件,这句话必不可少,否则会出错或刚才的文件不见了。
13、2、3 文件的操作 前面讲了那么多都是有关文件的理论,现在开始真正操作文件。在TURBO PASCAL中操作文件的过程是: 打开文件——进行读写操作——关闭文件。 打开文件和关闭文件的命令我们已经学过,现在开始学习读写操作。 读写操作的命令就是前面所学的READ、READLN、WRITE、WRITELN命令。 另外多了个函数:EOF() EOF()函数用来判断是否到了文件的结尾,如果是就为真,否则为假;
(1)、写文件;WRITE过程使用方法: WRITE(文件类型变量,变量1,变量2……); 功能: 将变量1、变量2等里面的数据存到与文件类型变量相联系的文件里去。注意变量的类型要与文件类型变量的基类型一致。 那么你想把数据存到文件中去,先把数据赋给变量1、变量2……,然后再通过WRITE(文件类型变量,变量1,变量2……)存到文件中去。 注意:WRITE(文件类型变量,变量1,变量2……)此语句中只能是变量,不能是表达式,也不能是具体的数。
(2)、读文件:READ过程的使用方法; READ(文件类型变量,变量1,变量2……); 功能:将与文件类型变量相联系的文件中的数据取出来,赋值给变量1、变量2……。这是一个顺序的过程,也就是说,把文件中的第一个数据赋值给变量1,第二个数据赋值给变量2。 同样,类型要匹配。 (3)、EOF函数使用方法: EOF(文件类型变量); 判断是不是已经到了文件的尾部,如果是的话就为TRUE,否则为FASLE。
2004年第一张让我流泪的照片 (4)、EOLN函数使用方法: EOLN(文件类型变量); 判断是不是已经到了文件中某一行的尾部,如果是的话就为TRUE,否则为FASLE。通常这与READLN、WRITELN搭配使用。 注意:READLN、WRITELN不能应用于类型文件,至于为什么在以后学习!
文件类型变量与文件到底是怎么联系的呢?他们之间的交换过程又是什么呢?文件类型变量与文件到底是怎么联系的呢?他们之间的交换过程又是什么呢? 过程:一旦通过ASSIGN命令把一个文件类型的变量与某个文件建立起联系以后,会自动引入一个文件缓冲器变量,也叫文件指针,指向文件的具体位置,比如说刚打开一个文件时,它指向文件的第一个元素,当从文件中读入一个数据赋值给文件类型变量后这个文件指针自动往下移动一个位置,指向文件的第二个元素的位置,以此类推。同理,写文件也是这样一个过程,首先指向文件的开始位置,写入一个数据接着指向第二个位置。 当然,这些过程是自动的。
(5)、定位过程:SEEK过程的使用方法: SEEK(文件类型变量,整型数值或表达式); 功能,把文件指针定位到数值或表达式的结果所指向的位置。 比如:SEEK(F,5+3); 它的功能就是把文件指针指向F文件的第8个位置,那么现在要操作(读或写)的对象就是第8个位置的元素。 注意:文件的第一个元素位置是0,并不是1!,所以第8个位置其实是文件的第9个元素。 那么,第N个位置就是文件的第N+1个元素。 注:这是TURBO PASCAL的扩展功能,标准PASCAL没有;
(6)、FILESIZE函数的功能: 求文件的元素个数。(注意是函数!) 利用这个函数和SEEK过程可以把文件指针指向最后。 SEEK(F,FILESIZE9F)); 这也是TRUBO PASCAL的扩展功能。
程序举例1:把数据写到文件中 将自然数1——10以及它们的平方根写到磁盘文件TABLE。DAT中。 program wfile(fv); var fv:file of real; i:integer; x,y:real; begin assign(fv,'table.dat'); rewrite(fv); for i:=1 to 10 do begin x:=i; y:=sqrt(i); write(fv,x,y); end; close(fv) end. {程序首部参数表中列出了文件变量名,也可以不写} {定义实型文件变量,那么存入的数据是实型} {调用ASSIGN过程使FV与TABLE。DAT联系, 此时不判断文件是否存在} {以写方式打开文件变量FV所联系的文件,此时判断文件是否存在} {向FV指向的文件写数据,此时的WRITE各项只能是变量} {关闭文件}
程序举例2:读文件中的数据。 把上例中TABLE。DAT中的数据读入,显示到屏幕上。 program rfile; var fv:file of real; x,sqrtx:real; {X、SQRTX用来接受文件传来的数据,一定要与文件数据元素类型一致} begin assign(fv,'table.dat'); reset(fv);{以读的方式打开文件,并且判断文件是否存在,注意顺序、随机文件的区别} while not eof(fv) do {执行循环,一直到文件尾为止} begin read(fv,x,sqrtx);{从FV指向的文件读数据,赋给X、SQRTX,此处只能是变量} writeln(x:3:0, sqrtx:8:3);{输出到屏幕,不是到文件} end; close(fv) ; {关闭文件,一定要记得,特别是写文件的时候,否则会出错。} end.
前面讲的这两个程序都是类型文件(类型文件就是用来专门存放某一种类型的文件),属于随机文件,而对于随机文件可以不按顺序来操作,也就是说不用从头开始一个一个地读文件中的数据,可以直接对其中某个位置的元素进行操作,进行读写,只要借助SEEK过程先把文件指针定位到相应的位置就可以了。前面讲的这两个程序都是类型文件(类型文件就是用来专门存放某一种类型的文件),属于随机文件,而对于随机文件可以不按顺序来操作,也就是说不用从头开始一个一个地读文件中的数据,可以直接对其中某个位置的元素进行操作,进行读写,只要借助SEEK过程先把文件指针定位到相应的位置就可以了。 再次强调,文件的第一个元素位置是0。第N个元素位置是N—1。
通过第一个程序,在文件TABLE。DAT中已经有了自然数1——10以及他们的平方根,排列的方式是:1、1的平方根、2、2的平方根……。通过第一个程序,在文件TABLE。DAT中已经有了自然数1——10以及他们的平方根,排列的方式是:1、1的平方根、2、2的平方根……。 现在下面的程序实现的功能是:从键盘输入1——10中的任意个数,在文件TABLE。DAT中找到它的平方根,并显示在屏幕上。 program randfile; var fv:file of real; x,sqrtx:real; n:integer; begin assign(fv,'table.dat'); reset(fv); {以读的方式打开文件,用REWRITE可以吗?} write('input a number:'); readln(n); seek(fv,2*(n-1)); {定位文件指针,以确定对文件中某个元素进行操作,为什么?} read(fv,x,sqrtx); {从文件中读两个数据,即某个数及它的平方根} writeln(x:3:0, sqrtx:8:3); close(fv) end.
程序举例3:在原有的数据文件中添加数据,要求不破坏原数据。程序举例3:在原有的数据文件中添加数据,要求不破坏原数据。 例如:要把新数据添加到TABLE。DAT中,使其包含1——20个自然数的平方根,主程序如下: ASSIGN(FV,’TABLE。DAT’); RESET(FV); {为什么要用RESET打开} SEKK(FV,FILESIZE(FV));{利用SEEK和FILESIZE把文件指针定位到文件最后} FOR I:=11 TO 20 DO BEGIN X:=I; Y:=SQRT(I); WRITE(FV,X,Y) {为什么不写成WRITE(FV,I,Y)} END; CLOSE(FV);