fortran语言教程第8章.docx
- 文档编号:8637429
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:31
- 大小:67.68KB
fortran语言教程第8章.docx
《fortran语言教程第8章.docx》由会员分享,可在线阅读,更多相关《fortran语言教程第8章.docx(31页珍藏版)》请在冰豆网上搜索。
fortran语言教程第8章
第8章FORTRAN语言的文件操作
在前面介绍的程序中,结果都是输出在屏幕上,数据都是通过键盘送入内存单元,实际上数据的输入/输出也可在磁盘上。
如图所示:
我们把放在磁盘上的数据称为数据文件。
数据文件由记录组成,FORTRAN中对文件的存取以记录为单位,即:
输出时:
一个输出语句的数据就是一个记录,叫写入文件。
输入时:
一个输入语句需要的数据就是一个记录,叫读出文件。
本章讨论FORTRAN程序的文件操作,也就是FORTRAN程序对磁盘数据文件的操作——读/写方式,并描述数据文件的记录结构,以及在程序设计中怎样建立,使用这些数据的记录结构。
8.1文件的概念
8.1.1文件的分类
1)按记录存储结构分:
顺序文件:
文件记录存储按照时间顺序依次存放,记录的逻辑次序与物理顺序是一致的,不能随意读或取某个记录,必须从首记录开始访问。
直接文件:
又叫随机文件,记录存放按记录号完成。
2)按记录数据存放格式分:
有格式文件:
记录以字符形式(或称ASCII码形式)存储,文件的数据流由一个个的字符组成,每个字符占据一个字节,每条记录用回车和换行符作为结束符,可以用文本编辑器(如记事本)直接打开查看。
无格式文件:
数据以计算机内部的二进制代码形式存放。
如果用文本编辑器直接打开查看,只能看到乱码符号。
二进制文件:
这是Microsoft的一种扩充模式,数据按其在内存中的存储形式存储在文件中,其数据流由二进制代码形式的一个个字节组成,结构最紧凑,适合保存大容量的数据。
用文本编辑器直接打开查看也只能看到乱码。
归纳起来,FORTRAN语言的文件可以分为:
有格式(顺序文件、直接文件、二进制文件);
无格式(顺序文件、直接文件、二进制文件);
8.1.2文件的操作
1)文件记录定位
文件在存取过程中,有一个文件指针控制着读写的位置,它总是指向当前进行输入或输出的那个记录,也可以通过语句拨动指针的位置。
2)文件操作的过程
打开文件:
要求机器分配一个供该文件使用的I/O缓冲区。
读或写文件:
将数据通过分配的I/O缓冲区向文件中读写记录。
关闭文件:
告诉机器文件操作完成,取消缓冲区的使用权限。
8.2文件相关操作语句
为了实现FORTRAN程序对文件的操作,FORTRAN系统为用户提供了相应的文件操作语句,本节将详细讨论这些语句的语法及其用法。
8.2.1OPEN语句
OPEN语句的功能就是打开一个文件,其语句的基本格式为:
OPEN(UNIT=unitspec,FILE=file,STATUS=status,ACCESS=access,BLANK=blanks,
FORM=form,MODE=mode,BLOCKSIZE=blocksize,RECL=recl,SHARE=share,
ERR=errlabel,IOSTAT=iocheck)
其中的大写部分是语句参数的标识名称,使用时照写(“UNIT=”可以省略);小写部分是语句参数的设定值,使用时根据需要设置。
如果忽略了UNIT=,则unitspec必须是第一个参数。
其它参数顺序可以任意。
其中:
unitspec指定一个文件缓冲区号,取值一般为2-255
file字符表达式,通常指文件的名称。
statas文件的状态,可以是:
‘OLD’——一个存在的文件(旧文件),如果文件存在,则打开。
否则出现一个I/O错误。
‘NEW’——文件决不能存在。
如果文件不存在,则创建该文件。
否则出现一个I/O错误。
‘SCRATCH’——当打开一个文件时,若省略了fname参数,则statas的缺省值为‘SCRATCH’,它表示打开一个暂存文件。
暂存文件是临时文件,当关闭或终止程序时文件将被删除。
‘UNKNOWN’——如果文件存在则打开,如果文件不存在则创建该文件。
相当于‘OLD’与‘NEW’参数的综合应用。
access文件存取方式。
可以是:
‘APPEND’——附加方式(一般很少使用)。
‘DIRECT’——直接存取方式。
‘SEQUETIAL’——顺序存取方式。
这是存取方式的默认值
blanks对文件中的数据进行处理。
‘NULL’——忽略数据中的空格。
‘ZERO’——把数据中的空格处理为零。
form文件操作时的数据格式。
可以是:
‘FORMATTED’——有格式。
‘UNFORMATTED’——无格式。
‘BINARY’——二进码格式。
如果该项省略,对顺序文件是‘FORMATTED’,对直接文件是‘UNFORMATTED’。
mode文件读/写属性。
可以是:
‘READ’——文件只读。
‘WRITE’——文件只写。
‘READWRITE’——文件既可读也可写。
blocksize整数表达式,用以指定文件缓冲区的大小。
此项缺省时系统定义为1024字节。
最大可以定义为32256字节。
recl直接文件方式每条记录的长度,应该是整型表达式。
share文件操作限制方式。
应该字符表达式,可以是:
‘COMPAT’——兼容方式(DOS中的缺省方式)。
当文件为文本方式时,原用户可以任意打开文件,其它用户则不能打开。
‘DENYRW’——禁止读/写方式。
‘DENYWR’——禁止写方式。
‘DENYRD’——禁止读方式。
‘DENYNONE’——非禁止方式。
此方式文件可以任意操作。
errlabel整型数,同一程序单元中可执行语句的标号,当文件操作发生一个I/O错误时,则转到指定标号去执行程序。
iocheck整型变量,由此变量返回一个I/O状态值。
如果未遇到错误,返回零。
如果遇到一个文件尾记录,返回一个负值。
如果遇到一个错误,则返回错误信息码。
OPEN语句的格式复杂,但在实际使用中很多参数都是可以省略的。
8.2.2READ/WRITE语句
FORTRAN语言中对文件的操作仍然用READ和WRITE语句实现,但与前面各章的用法略有不同。
1)READ语句
功能:
从指定文件中读取数据。
格式:
READ(u,f,END=endlabel,ERR=errlabel,REC=rec,IOSTAT=iocheck)变量名表
其中:
u——连接文件的逻辑设备号
f——某个FORMAT格式语句的标号
endlabel——遇到文件结束标记时转到本程序单元中可执行语句的标号。
errlabel——遇到一个读入错误时转到本程序单元中可执行语句的标号。
rec——为直接文件指定一个记录号。
iocheck——整型变量,用于返回读取操作的状态值。
(见OPEN语句中的iocheck
参数说明)。
变量名表——用于保存从文件中读取数据的变量序列。
例如:
READ(9,*)A,B,C,D
从以9号文件缓冲区连接的顺序文件中以自由格式读取4个数据。
分别存放到变量A、B、C、D中。
例如:
READ(8,*,REC=5,ERR=150)(A(I),I=1,10)
在以8号文件缓冲区连接的直接文件中,从第5号记录内读取10个数据,分别赋给数组A中的诸元素。
如果遇到一个读入错误,不中断程序执行,而转到标号为150的语句去继续执行程序。
2)WRITE语句
功能:
把数据按一定的格式写入到指定的文件中去。
格式:
WRITE(u,f,REC=rec,ERR=errlabel,IOSTAT=iocheck)输出项目表
其中:
u——文件逻辑设备缓冲区号。
f——某个FORMAT格式语句的标号。
rec——指定直接文件的记录号。
errlabel——遇到一个写入错误时转到本程序单元中可执行语句的标号。
iocheck——整型变量,用于返回一个I/O状态值。
见OPEN语句。
输出项目表——输出项目的列表,可以是数组、数组元素、变量、常量、表达式和函数。
例如:
WRITE(8,*)A,B,C,D
把变量A、B、C、D中的数值按自由格式方式写入到与8号文件缓冲区相连的顺序文件中去。
例如语句:
WRITE(9,100,REC=6)(M(K),K=1,10)
100FORMAT(10I6)
把数组M中的10个数据以100标号的FORMAT语句指定的格式写入到与9号文件缓冲区相连的直接文件第6号记录中去。
8.2.3CLOSE语句
功能:
于关闭一个指定的文件。
格式:
CLOSE(u,ERR=errlabel,STATUS=status,IOSTAT=iocheck)
其中:
u——文件逻辑设备缓冲区号。
errlabel——遇到一个操作错误时转到本程序单元中可执行语句的标号。
status——文件属性,可为一个字符表达式:
‘DEEP’为非常文件。
一般为临时文件。
‘DELETE’关闭时删除的临文件。
iocheck——整型变量,用以返回一个I/O状态值,见OPEN语句。
例如语句:
CLOSE(9),表示关闭与9号文件缓冲区相连的文件。
关闭文件指切断文件与文件缓冲区的连接,禁止对文件进行读/写操作。
一般情况下,当程序停止执行时,系统将自动关闭所有打开的文件。
在程序设计中,为不引起文件操作的混乱,正常情况下,对一个已打开的文件,如果不再对其操作,一般应将其关闭。
8.2.4REWIND语句
在FORTRAN文件操作中,顺序文件是按数据顺序操作的,直接文件虽然可以指定记录号,但在每条记录中的数据还是按顺序的。
如果要对文件前面、中间或最后的数据进行操作,则需要一些特殊的语句来完成。
功能:
将文件的指针重新定位在其第一条记录上。
格式:
REWIND(u,ERR=errlabel,IOSTAT=iocheck)
其中:
u——文件逻辑设备号。
errlabel——遇到一个I/O错误,转到本程序单元中可执行语句的标号。
iocheck——整型变量,返回I/O操作状态值,见OPEN语句。
例如有一个数据文件A.DAT的数据如下:
1,2,3
4,5,6
7,8,9
有程序如下:
OPEN(8,FILE=’A.DAT’)
READ(8,*)A,B,C
READ(8,*)X,Y
REWIND(8)
READ(8,*)A1,B1,C1
CLOSE(8)
WRITE(*,*)A,B,C
WRITE(*,*)X、Y’
WRITE(*,*)A1,B1,C1
END
程序运行后的结果显示:
1.0000002.0000003.000000
4.0000005.00000
1.0000002.000003.000000
从显示结果中可以看出,当读入数据到变量Y时,文件指针指向数据6。
执行REWIND语句后,文件指针指向数据1,然后重读A1,B1,C1。
它们的数据分别为1,2,3。
8.2.5BACKSPACE语句
功能:
从当前记录位置回退到上一个记录位置。
格式:
BACKSPACE(u,ERR=errlabel,IOSTAT=iocheck)
其中:
u——文件逻辑设备号。
errlabel——遇到一个I/O错误时转到本程序单元中可执行语句的标号。
iocheck——整型变量,返回I/O操作状态值。
见OPEN语句。
例如有数据文件A.DAT:
1,2,3
4,5,6
7,8,9
执行程序:
OPEN(8,FILE=’A.DAT’)
READ(8,*)I,J,K
READ(8,*)M,N
BACKSPACE(8)
READ(8,*)I1,J1,K1
CLOSE(8)
WRITE(*,*)I,J,K
WRITE(*,*)M,N
WRITE(*,*)I1,J1,K1
END
程序执行后显示:
123
45
456
8.2.6ENDFILE语句
功能:
把一个记录作为文件末尾记录写入文件中。
原文件末尾记录被写入记录更新。
格式:
ENDFILE(u,ERR=errlabel,IOSTAT=iocheck)
其中:
u——文件逻辑设备号。
errlabel——遇到一个I/O错误转到本程序单元中的可执行语句标号。
iocheck——整型变量,用于返回I/O状态值,见OPEN语句。
要特别注意的是,如果打开文件时,文件指针指向第一个记录位置。
这时使用ENDFILLE语句后,写入的记录作为文件尾记录,原文件记录将被全部删除。
这是要特别注意的地方。
例如有数据文件A.DAT数据如下:
1,2,3
4,5,6
7,8,9
10
执行程序:
DIMENSIONM(10)
OPEN(8,FILE=’A.DAT’)
READ(8,*)(M(I),I=1,10)
WRITE(*,’(5X,3I5)’)(M(I),I=1,10)
BACKSPACE(8)
WRITE(8,’(I2)’)11
ENDFILE(8)
REWIND(8)
CLOSE(8)
END
程序运行后显示:
123
456
789
10
但是原数据文件A.DAT已经改变,它的文件末尾记录被写入数据11。
其文件A.DAT现在数据如下:
E:
\FOR>TYPEA.DAT
1,2,3
4,5,6
7,8,9
11
8.2.7INQUIRE语句
功能:
返回一个设备或文件的各种特性。
格式:
INQUIRE([UNIT=]unitspec∣FILE=file[,ACCESS=access][,BINARY=binary]
[,BLANK=blank][,BLOCKSIZE=blochsize][,DIRECT=direct][,ERR=errlabel]
[,EXIST=exist][,FORM=form][,FORMATTED=formatted][,IOSTAT=iocheck]
[,MODE=mode][,NAME=name][,NAMED=named][,NEXTREC=nextrec][,NUMBER=num]
[,OPENED=opened][,RECL=recl][,SEQUENTIAL=seq][,SHARE=share]
[,NUFORMATTED=unformatted])
其中,“|”表示[UNIT=]unitspec和FILE=file两项只能选择一项。
各参数含义为:
unitspec逻辑设备号或文件缓冲区号。
file字符表达式,外部文件的名称。
access字符变量,返回‘SEQUENTIAL’(顺序方式),或返回‘DIRECT’(直接方式)。
binary字符变量,如果文件为二进码格式,返回‘YES’,否则返回‘NO’或‘UNKNOWN’。
blank字符变量,如果文件数据忽略空格返回‘NULL’,如果空处理为零,则返回‘ZERO’。
blocksize整型变量,返回文件缓冲区大小的字节数。
direct字符变量,如果文件是直接方式,返回‘YES’,否则返回‘NO’或‘UNKNOWN’。
errlabel同一程序单元中可执行语句的标号。
exist逻辑变量,如果文件存在返回.TRUE.,否则返回.FALSE.。
form字符变量,如果文件是有格式的,返回‘FORMATTED’。
formatted字符变量,如果文件是带格式文件,返回‘YES’,否则返回‘NO’或‘UNKNOWN’。
iocheck整型变量,返回I/O操作的状态值。
mode字符变量,返回文件的模式状态。
与OPEN语句说明的模式一样,即为‘READ’、‘WRITE’和‘READWRITE’。
name字符变量,返回与缓冲区相连的文件名。
named逻辑变量,如果文件没有打开或文件是一个临时文件,返回.FALSE.,否则返回.TRUE.。
nextrec整型变量,返回直接文件中的下一个记录号。
num整型变量,返回与文件相连的文件缓冲区号。
opened逻辑变量,如果文件与设备相连,返回.TRUE.,否则返回.FALSE.。
recl整型变量,返回直接文件方式的记录长度。
seq字符变量,文件为顺序模式,返回‘YES’,否则返回‘NO’或‘UNKNOWN’。
share字符变量,返回指定文件的当前共享状态,与OPEN语句说明的一样为:
‘COMPT’、‘DENYRW’,‘DENYWR’、‘DENYRD’和‘DENYNONE’。
unformatted字符变量,若文件为无格式方式,返回‘YES’,否则返回‘NO’或‘UNKNOWN’。
当用户对未知文件或虽然是用户自己的文件,但时间长现在记不清楚的时候,INQUIRE语句可以帮助用户返回文件的相关特性信息。
例如现在有一批文件名准备要对其进行操作,但不知磁盘上是否有这些文件。
那么下面的程序可以获得文件是否存在的信息。
程序如下:
CHARACTERfm*15
LOGICALex
77WRITE(*,‘(A)’)‘Enterthefilename:
’
READ(*,‘(A)’)fm
INQUIRE(FILE=fm,EXIST=ex)
IF(.NOT.ex)THEN
WRITE(*,‘(10x,A,1X,A)’)‘Cannotfindfile’,fm
GOTO77
ENDIF
END
程序运行显示如下:
Enterthefilename:
S.DAT
CannotfindfileS.DAT
Enterthefilename:
S1.DAT
CannotfindfileS1.DAT
Enterthefilename:
A.DAT
E:
\FOR>
程序运行提示输入文件名并回车,如果文件存在,则停止执行程序。
若文件不存在,则继续查找。
使用INQUIRE语句可根据要查询的项目选择相关参数,通常情况下很少会用到全部参数项。
除UNIT项或FILE项必须放在第一项的位置外,其余参数项的位置可以任意。
8.3文件的使用
FORTRAN程序中对于文件的使用是程序设计的基础技能之一。
文件的使用可以避免从键盘输入数据容易出错的问题,数据文件的保存可以保留大量有用的数据及重复使用这些数据,并可以相互利用这些数据。
特别是不同语言程序之间的磁盘数据共享,使用文件是非常实用的手段。
按照文件分类,本节将依次介绍:
有格式顺序文件的使用;无格式顺序文件的使用。
有格式直接文件的使用;无格式直接文件的使用。
有格式二进制文件的使用;无格式二进制文件的使用。
8.3.1有格式顺序文件的使用
【例8.1】把20个整型数和20个实型数以有格式顺序方式存入文件SF1.DAT中。
程序如下:
DIMENSIONM(20),A(20)
DO10I=1,20
M(I)=I**2
A(I)=SIN(I*1.2)
10CONTINUE
OPEN(8,FILE='D:
\SF1.DAT',STATUS='UNKNOWN')
WRITE(8,'(5I5)')(M(I),I=1,20)
WRITE(8,'(5F10.6)')(A(I),I=1,20)
CLOSE(8)
END
程序运行之后,没有任何显结果。
用记事本将D:
\SF1.DAT文件打开可看见结果:
从建立的SF1.DAT文件可以看出有格式顺序文件的基本数据模式。
文件建好之后,可以用另一个FORTRAN程序读取这些数据。
【例8.2】编写一程序,把文件SF1.DAT中的数据读出,并分别求20个整型数与20个实型数的和。
DIMENSIONM(20),A(20)
OPEN(8,FILE='SF1.DAT')
READ(8,*)(M(I),I=1,20)
READ(8,*)(A(I),I=1,20)
CLOSE(8)
DO10I=1,20
N=N+M(I)
S=S+A(I)
10CONTINUE
WRITE(*,'(2X,I7,5X,F16.7)')N,S
END
程序运行后显示:
2870-.0319510
以上两个例子可以看出,如果要使程序建立的数据文件具有显示与再编辑功能,可以使用有格式顺序文件。
8.3.2无格式顺序文件的使用
【例8.3】编写一程序,产生30个随机整数,把这30个随机整数以无格式顺序文件方式存入文件SF2.DAT中。
DIMENSIONM(30)
DO10I=1,30
M(I)=RAND()*100
10CONTINUE
OPEN(9,FILE='D:
\SF2.DAT',STATUS='UNKNOWN',FORM='UNFORMATTED')
WRITE(9)(M(I),I=1,30)
CLOSE(9)
END
FUNCTIONRAND()
SAVESEED
INTEGERSEED,C1,C2,C3
PARAMETER(C1=29,C2=217,C3=1024)
DATASEED/12/
SEED=MOD(SEED*C1+C2,C3)
RAND=REAL(SEED)/C3
RETURN
END
程序运行后磁盘上有一个SF2.DAT文件。
用记事本打开可看见结果:
以上显示的SF2.DAT文件的内容,只是一系列ASCⅡ码,具体数据是不清楚的,这是无格式文件的特点。
但这些数据并非不能使用,可以用无格式文件方式来读取它。
【例8.4】编写一程序,读取文件SF2.DAT中的数据,并把这些数据按从大到小的顺序排列。
DIMENSIONM(30)
OPEN(9,FILE='D:
\SF2.DAT',FORM='UNFORMATTED')
READ(9)(M(I),I=1,30)
CLOSE(9)
CALLPX(M,30)
WRITE(*,'(2X,10I6)')(M(I),I=1,30)
END
SUBROUTINEPX(M,N)
DIMENSIONM(N)
DO10I=1,N
DO20J=I,N
IF(M(J).GT.M(I))THEN
K=M(I)
M(I)=M(J)
M(J)=K
ENDIF
20CONTINUE
10CONTINUE
RETURN
END
程序运行后显示:
99949089767574716766
65615553515049484439
3832292524222118156
以上程序可以看出,无格式顺序文件虽然以二进制形式存盘,但读取这些数据还是很方便的。
8.3.3有格式直接文件的使用
【例8.5】已知有五个学生的姓名及每个学生的5科成绩。
编写一程序,把每个学生的姓名及5科成绩以有格式直接文件的方式存入文件SF3.DAT。
DIMENSIONM(5,5)
CHARACTERNAME(5)*8
DATANAME/'李鸣','汪小莉','罗乾','王小刚','蒋涵'/
DATAM/98,89,67,77,56,
$60,66,75,70,87,
$91,85,78,88,68,
$92,67,73,80,77,
$90,92,89,94,86/
OPEN(10,FILE='D:
\SF3.DAT',STATUS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- fortran 语言 教程