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












