土木学院1/46第十三章文件(FORTRAN的文件操作)土木学院2/46说明:在实际应用中,往往大量需要处理的数据是由专门人员来采集,并构成以文件名来具体代表的数据文件(比如大型有限元软件的数据采集也是这样的);文件名通常由三部分组成:存放的设备、文件名本身、文件类别;如何从各种设备上获取和保存不同类型的数据文件就是我们在进行科学计算时常常遇到的问题;我们现在主要以磁盘设备为例来介绍FORTRAN对文件操作的语句(打开、关闭、定位、输入和输出)土木学院3/46FORTRAN的数据文件由记录组成,也就是对文件的存取是以记录为单位进行的;记录:长度不超过规定范围的数字或文本的集合;Fortran的数据文件按存取方式可划分为:1.顺序存取文件(顺序文件)其存取操作必须从头到尾顺序进行;2.直接存取文件(直接文件或随机文件)在程序的执行过程中对任意一个指定的记录进行操作(读和写)。记录文件土木学院4/46FORTRAN中数据文件的存储形式:1.字符形式(ASCII)——称之为“有格式存放”FORMATTED2.二进制数代码形式——称之为“无格式存放”UNFORMATTED土木学院5/46本章主要内容:有格式顺序存取文件;有格式直接存取文件;无格式文件的存取;文件操作语句;有关文件操作的程序举例。土木学院6/4613.1有格式顺序存取文件我们已经知道:READ语句是完成数据输入任务的。从键盘输入一行数据(以Enter键作为确认),这就形成了一个“记录”。从键盘输入一行数据时,必须与指定的格式对应(格式编辑符与输入的数据类型以及宽度),否则就会出错(或报错)。土木学院7/4613.1有格式顺序存取文件Read(*,100)A,BC=A+BWrite(*,200)‘A=‘,A,‘B=‘,BWrite(*,200)‘C=‘,C100Format(2F6.1)200Format(1X,2(A,F7.2))End输入:__10.1__20.4输出:A=__10.10_B=__20.40C=__30.50从键盘接收数据,经过处理,然后输出显示.土木学院8/46Read(*,100)A,BC=A+BWrite(*,200)'A=',A,'B=',BWrite(*,200)'C=',C100Format(2F6.1)200Format(1X,2(A,F7.2))End土木学院9/46土木学院10/4613.1有格式顺序存取文件下面我们就介绍如何从文件中获得数据:(例如:从文件F1.DAT中读取数据,经过处理后,将结果保存在F2.DAT中)1.准备数据文件(可以在各种编辑器中完成,输入格式及宽度与程序要求的一致),数据文件名的后缀为*.DAT(也可以是*.txt);2.编写数据输入和数据处理文件,最后将结果输出到F2.DAT中.土木学院11/46土木学院12/46character*8Fname1IntegerU1U1=3Fname1='F1.DAT'Open(Unit=U1,File=Fname1,Status='OLD',$Access='Sequential',Form='Formatted')Read(U1,100)A,BC=A+BOpen(Unit=2,File='F2.DAT',Status='New',$Access='Sequential',Form='Formatted')Write(2,200)'A=',A,'B=',BWrite(2,200)'C=',CClose(U1)Close(2)100Format(2F6.1)200Format(2(A,F7.2))End_123.1_123.2F1.DAT的内容A=_123.10B=_123.20C=_246.30F2.DAT的内容数据输出数据输入和数据处理注:该源文件与数据文件放在同一目录中土木学院13/46这是已被打开的数据文件的内容土木学院14/46土木学院15/46U1=2Open(Unit=2,File='F2.DAT',Status='New',$Access='Sequential',Form='Formatted')do10I=1,30write(*,*)请输入学号、两门成绩Read(*,*)N,A,BC=A+BWrite(2,202)'学号:',N,'总成绩',C10continueClose(2)100Format(I2,F5.1,F5.1)202Format(A,I2,A,F7.1)End输入30个学生的学号和两门成绩,最后将总成绩与学号输出来.土木学院16/46这是打开数据文件F2.DAT的内容土木学院17/4613.1有格式顺序存取文件打开文件(Open):是把一个设备号和一个文件名关联起来,这样在程序中将由设备号代替指定的文件;Unit=ie代表设备号(0~99)File=ce代表文件名;Status=se代表文件状态:已经存在-Old;新建-NewAccess=SD代表文件的存取方式:Direct:以直接方式存取;Sequential:以顺序方式存取;Form=fe代表文件存放格式:Formatted-字符形式在Open中省略Access和Form,则表示打开文件为有格式顺序存取文件.Open(Unit=2,File='F2.DAT',Status='New',Access='Sequential',Form='Formatted')土木学院18/4613.1有格式顺序存取文件关闭文件(Close):解除设备号和一个文件名的关联.CLOSE(设备号)一次只关闭一个设备号;在程序中的STOP\END语句都具有Close的功能顺序文件的输入操作:READ(设备号,格式说明,END=语句标号)变量表顺序文件的输出操作:Write(设备号,格式说明)输出项表与OPEN中指定的设备号相同一般不写土木学院19/46举例:读出一个数据文件记录,并把它显示在屏幕上Open(Unit=2,File=‘TAB.DAT’,Status=‘NEW’$Access=‘Sequential’,Form=‘Formatted’)Do10X=1,10Write(2,100)X,X*X,X*X*X10ContinueRewind(2)Write(*,*)‘XX*XX*X*X’20Read(2,100,End=30)A,B,CWrite(*,200)A,B,CGoto2030Close(2)100Format(3F7.1)200Format(1X,3F9.2)End将文件指针重新设置在文件开头(与设备号2连接的文件的开头)End=30表示一旦读到文件结束标志就不再进行读操作而转到标号为30的语句继续执行。土木学院20/46土木学院21/46这是打开数据文件TAB.DAT的内容土木学院22/46IntegerN(30)RealA(30),B(30),C(30)Write(*,*)“请从键盘上输入学号、两门成绩Do300i=1,30Read(*,101)N(I),A(I),B(I)300ContinueWrite(*,*)N,A,BU1=2Open(Unit=2,File='F2.DAT',Status='New',$Access='Sequential',Form='Formatted')Do10I=1,30C(I)=A(I)+B(I)write(2,150)N(I),c(I)10continueclose(2)101format(I3,F5.1,F5.1)150format(I2,3x,F5.1)End使用数组:输入30个学生的学号和两门成绩,最后将总成绩与学号输出来.土木学院23/46土木学院24/4613.1有格式顺序存取文件--顺序文件输入输出的基本规则Read语句中各输入项在类型上、格式说明上必须与输出语句的输出项按位置一一对应;Open或Rewind是从文件的第一个记录开始输入,每执行一次Read语句,总是从一个新的记录开始读入;在Read语句读文件记录时,输入项少于记录中的数据项,则剩余数据被忽略.输入项多于记录中的数据项,它将接着去读下一个记录,直到所有项都获得数据或者遇上文件结束标志为止;在程序设计中对一个顺序文件不可能做到“重写前半部分而保留后半部分”这样的操作。土木学院25/4613.1有格式顺序存取文件--顺序文件输入输出的基本规则一个WRITE语句总是开始一个新的记录;一般来说,对同一个文件在进行写操作之后要进行读操作时,必须先使用文件定位语句,重新设置指针位置(Open语句、Rewind语句以及Backspace语句等);也可以使用表控输入输出语句对文件进行格式输入输出,如:WRITE(3,*)N,M。Next土木学院26/4613.2有格式直接存取文件直接存取可以任意确定需要读写记录的位置;直接存取只适用于磁盘文件;其基本的操作与顺序存取大致相同,主要不同的是:Open的说明、Read和Write的控制项不同。下面以例说明土木学院27/4613.2有格式直接存取文件主要语句:Open(12,File=‘Datb.Dat’,Status=‘New’,Access=‘Direct’,Form=‘Formatted’,Recl=16?)记录的长度,以字节为单位。在直接存取文件中每个记录的长度是相等的,但真正写到文件中的实际字节的个数可以比说明的长度短。下面举例:1)建立一个直接存取文件;2)根据用户输入记录号,输出该记录。土木学院28/46Parameter(N=10)Open(12,File=‘Datb.Dat’,Status=‘New’,$Access=‘Direct’,Form=‘Formatted’,Recl=16)Do10I=1,NWrite(12,100,Rec=I)I,Sqrt(Real(I))10Continue100Format(I3,E13.6)Close(12)Open(10,File=‘Datb.Dat’,Status=‘old’,$Access=‘Direct’,Form=‘Formatted’,Recl=16)CallFromkey(k)Do20While(k.GE.0)IF(k.LE.N.AND.K.GE.1)THENRead(10,100,Rec=K)IS,SWrite(*,200)IS,SELSEWrite(*,*)‘InputError!’EndifCallFromkey(K)20ContinueClose(10)200Format(1x,Sqrtof‘,I2,’IS:’,F10.6)EndSubroutineFromkey(K)Write(*,*)‘Enter0toend:’Write(*,*)‘EnteraNumber’Read(*,*)KEnd1-10的开方值读出该记录后再用Write语句输出到屏幕上记录的长度,以字节为单位。在直接存取文件中每个记录的长度是相等的,但真正写到文件中的实际字节的个数可以比说明的长度短。记录号:是不可少的参数,文件的第一个记录的记录号为1土木学院29/46Parameter(N=10)Open(12,File='Datb.Dat',Status='New',Access='Direct',Form='Formatted',Recl=16)Do10I=1,NWrite(12,100,Rec=I)I,Sqrt(Real(I))10Continue100Format(I3,E13.6)Close(12)Open(10,File='Datb.Dat',Status='old',Access='Direct',Form='Formatted',Recl=16)CallFromkey(k)Do20While(k.GE.0)IF(k.LE.N.AND.K.GE.1)THENRead(10,100,Rec=K)IS,SWrite(*,200)IS,SELSEWrite(*,*)'InputError!'EndifCallFromkey(K)20ContinueClose(10)200Form