Fortran作为一门运算效率较高古老的高级语言,在气象领域拥有着不低的影响力。作为一门独立发展出来的高级语言,其和C语言序列中的很多操作都是不通用的。小编也是在写这篇文章时才忽然意识到这点,原来Fortran是和C平级的,高人竟在我身边!
那么,使用Fortran语言读写文件又有哪些要注意的呢?一起来学习吧~
Fortran中对文件的读写操作主要通过open,read,write三个函数实现。
需要注意的是,不同于自动生成文件识别码的MATLAB、Python等语言,Fortran的文件识别码需要自行指定。(即open等文件操作函数中的UNIT项)。
Fortran预定义了4种外部文件(设备),在定义的时候应当尽量避免:
设备号
连接的设备
星号(*)
总是键盘和显示器
0
缺省状态下是键盘和显示器
5
缺省状态下是键盘
6
缺省状态下是显示器
但在实际应用时,不避开这几个数字也不会产生太大影响。只需要注意对同一个文件进行操作时,open和read、write、close函数中的文件标号相同即可。
open函数中,其可选项为:
open([UNIT=]unit[,ACCESS=access][,ACTION=action][,BLANK=blanks][,BLOCKSIZE=blocksize][,CARRIAGECONTROL=carriagecontrol][,DELIM=delim][,ERR=err][,FILE=file][,FORM=form][,IOFOCUS=iofocus][,IOSTAT=iostat][,PAD=pad][,POSITION=position][,RECL=recl][,SHARE=share][,STATUS=status])
UNIT(unit):设备号说明。必须为正整数,当unit为第一项时,书写过程中常常省略“UNIT=”。
ACCESS(access):存取方式说明。可选择:
append 追加方式(在文件后继续写入)
sequential 顺序访问方式
direct 直接访问方式(或随机访问,类似python中字典、集合类型的操作)
当省略此说明项时为顺序访问方式。
ACTION(action):描述文件的读写属性,可选择:
read 文件为只读方式打开
write 文件为只写方式打开
readwrite 文件为可读写方式打开
当省略此说明项时,文件打开顺序:READWRITE->READ->WRITE。
BLANK(blank):说明数据格式输入字段中空格的含义。可选择:
当省略此说明项时为zero。此说明只能用于格式输入。
BLOCKSIZE(blocksize):指定以字节为单位的设备缓存的大小,默认值为一4字节整数。
CARRIAGECONTROL(carriagecontrol):指明处理文件中的第一个字符的方式。可选择:
fortran 对第一个字符作一般的Fortran解释
list 指出在文件的每两个记录之间有—个空格
默认状态下,对于连接到打印机和显示器这样的设备,设置值为fortran,对于连接到文件的设备,设置值为list。当FORM被设成unformatted和binary时,其值被忽略。
DELIM(delim):指明分隔直接列表或格式化名称列表记录的方式。可选择:
apostrophe 用单撇号(’)分隔
quote 用双撇号(”)分隔
none 不用分隔符
ERR(err):出错处理说明。其值是同一程序中的一条语句的标号,当OPEN语句执行出错时执行此语句。如果省略该项,则出错时给出出错信息并终止运行。
FILE(file):文件名。由于Fortran语言的编码问题,注意文件路径中尽量不要使用中文。
FORM(form):记录格式说明。可选择:
formatted 记录按有格式存放。
unformatted 记录按无格式存放。
当省略此说明项时为:对顺序文件是有格式的;对直接文件是无格式的。
IOFUS(iofus):指出一个新Quickwin子窗口是否为活动窗口,其值为逻辑值。缺省值为真。
IOSTAT(iostat):出错状态说明。iostat是—个缺省长度为4的整形变量。当执行此open语句时系统给变量赋值:
零 没有发生错误
负数 文件结尾
正数 发生错误,其值视具体计算机系统而定
若省略该项则没有此功能。
PAD(pad):从格式化文件中记录的数据少于要读取的数据时,是否用空格来填充没有从记录中读到数据的变量。
yes 填充(默认值)
no 不填充
POSITION(position):指定打开顺序文件的访问位置。
asia 已被连接的文件的访问位置是固定的,未被连接的文件的访问位置是文件的开始处。可选择:
rewind 把文件的访问位置定在文件的开始处(文件己存在)。
append 把文件的访问位置定在文件的末尾处(文件己存在)。
对于一个新文件,文件的访问位置总是被定在文件的开始处。
SHARE(share):指明当文件打开时是否实现文件的锁定。可选择:
denyrw 动态读写模式。不允许其他的进程打开这个文件。
denywr 动态写模式。不允许其他的进程以写的方式打开这个文件。
denyrd 动态读模式。不允许其他的进程以读的方式打开这个文件。
denynone 默认的非动态模式。允许其他的进程打开这个文件。
STATUS(status):文件状态说明。
new:表示指定的文件尚不存在。执行OPEN语句时将在磁盘上建立该文件并使其状态改变为OLD。NEW状态一般用于写操作。如果指定的文件名已经存在将给出出错信息(有的系统不给出信息而是把这个已经存在的文件冲掉使原来的内容不复存在)。
scratch:表示与设备号相连接的文件在关闭时将被自动删除。注意:此状态不能与FILE说明共存,只能用于由计算机系统指定的文件名,使该文件作为程序运行过程中的一个临时性文件。
replace:替换一个有相同名字的文件,如果没有同名的文件存在,将产生一个新文件。
unkown:表示文件可以是已存在的或不存在的。系统打开文件状态的次序为:old->new->创建新文件。status的设置值只影响磁盘文件,像键盘和显示器这样的设备将忽略这一设置。
若省略该项时默认的状态为unknown。
是不是已经听晕了?等等等等以上种种暂时都可以忘记了,因为在实际使用时,通常用法是以下几种:
有格式文件:
新文件:
open( 1, file = ‘…’, status = ‘new’, form = ‘formatted’ )
OR
旧文件:
open( 1, file = ‘…’, status = ‘old’)
无格式/顺序文件:
新文件:
open( 1, file = ‘…’, status = ‘new’, form = ‘unformatted’, access = ‘sequential’ )
OR
旧文件:
open( 1, file = ‘…’, status = ‘new’, form = ‘unformatted’ )
无格式/直接文件:
open( 1, file = ‘…’, status = ‘new’, form = ‘unformatted’, access = ‘direct’, recl = … )
■ AUTUMN
由于Fortran遗世独立的特性,因此其格式化字符的方式也显得特立独行,其格式化字符的方式为:
符号
使用对象
I
整数
F
实数
E
实数,指数表示法(非标准科学计数法)
ES
实数,标准科学计数法
A
字符
L
逻辑数
X
插入空格
T
移动至同一数据行中某一字符位置
/
换行
符号
用途
c
一行中的第c个字节位置
d
用于实数,输入或输出的小数位数,不足则四舍五入
m
至少输出的位数,若为2,则至少输出两位,即是变量的字符数小于2,也要输出两位
n
插入空格的数目
r
描述符的使用次数,如2I2,I2格式输出两次。*号表示无限次重复直到结束
w
域宽,输入或输出占用的字符数,可以理解成是放字符的有效空间
表格来自https://blog.csdn.net/weixin_43780543/article/details/89928567,有改动。
其基本语法为:
rIw.m、rEw.d、rESw.d、rFw.m、rLw、rA 或 rAw。
其他特殊用法:
nX:输出位置向右移动n位。
read(1,” (19XF7.2)”)!跳过前19个字符,再以总域宽7,保留小数点后两位的格式读取。write(*,”(5X,I3)”) 100) !将先填5个空格,再输出整数。
Tc:表示将输出位置移动到本行中的第c个字节。
100 FORMAT( ‘ ‘ , T10 , I3) !先跳到本行中第10个字符位置,然后输出a变量
打开对应文件,经历一系列一系列的格式设置之后,就可以:
read(1,100) a!1为文件号,100为之前设置格式format行的标识,a为所需读出的变量
同理,可以写入:
write(1,100)a!多个变量之间可用逗号,隔开
好了!大功告成,最后只要记得关闭打开的文件:
close(1)
恭喜,你已经完成了一次成功的读写流程!基本知识学完了,来下面这些链接学习一些复杂技巧吧:
Fortran 究竟如何读取nc(netcdf)数据:(by:游子)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=11807
Netcdf文件格式了解及如何创建、读取:(by:godenflame135)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=4904
用Fortran读nc数据的程序:(by:wlzhongouc)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=4731
fortran读取nc数据文件:(by:xu850202)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=8416
分享个用fortran读nc文件的源程序(已修复):(by:残月)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=988
大型机Linux系统Fortran读取nc文件:(by:小哥8号)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=95180
[求助]fortran读取txt文件 读取的时候怎么跳过开头数据信息:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=10065
文件中有空行的fortran处理方法:(by:mofangbao)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=1442
[求助] 用Fortran读写CSV文件:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=67184
气象数据处理脚本篇(二):批处理:(by:雪花纷飞)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=8060
fortran生成二进制数据(.dat)之后自动生成ctl文件:(by:虫儿飞)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=31250
Fortran版diamond4转grads的源程序:(by:mofangbao)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=1598
Fortran实现批量处理的方法总结(读取一个目录下所有文件)(支持WIN7):(by:mofangbao)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=3079
利用探空资料和micaps第五类数据格式绘制历史探空图:(by:流觞曲水)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=16026
(批处理程序)MICAPS第五类数据:TLOGP和站点剖面图数据,Windows和Linux:(by:ljh110011)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=68533
Micaps一类数据的fortran批处理:(by:mofangbao)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=6473
Micaps第二类转GrADS的fortran源代码及其作图:(by:mofangbao)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=845
给大家共享读取SWAN的 QPE QPF 数据的FORTRAN代码:(by:☆why)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=22480
OLR资料说明及相应的FORTRAN读入程序:(by:love2100)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=6915
COSMIC数据读取和计算可降水量:(by:ryeyang)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=25128
[求助]请大家帮忙看一个FORTRAN程序!我想用FORTRAN程序读取FY2E GPF文件……
http://bbs.06climate.com/forum.php?mod=viewthread&tid=7525
Fortran中binary和unformatted,以及要回避的坑:(by:ljh110011)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=91979
本期内容到此结束!意犹未尽?
欢迎到家园Fortran板块,一起玩耍吧!
http://bbs.06climate.com/
排版:泰日印的三角恋