固定格式和自由格式的区别
表格来源 | 固定格式 | 自由格式 |
英文 | fixed-format | free-format |
扩展名 | .for .f … | .f90 .f95 .f03 … |
格式 | 代码从第7格开始 | 任意 |
续行 | 在第6格键入一个非0字符 | 在前一行最后加入& |
行宽 | 72 | 132 |
注释 | 行首打C或者c或者* | 注释前打感叹号! |
注意:
- Fortran77代码必须从第7格开始写,这点一定要注意
- number值要避开1、2、5、6。因为2、6是默认输出位置。1、5是默认输入位置,也就是键盘。
c 这是Fortran的hello world程序
PROGRAM Example
write(*,*) 'hello world'
END
out:
hello world
输入和输出
输出
Fortran里的输出有两种,write和print。
- write,括号里有两个
*
号,第一个*
号代表输出位置,默认是6,即屏幕。第二个*
号代表输出格式化设定(自由格式)。 - print比write少一个
*
号,因为print是面向屏幕输出的。print的*
号和write的第二个*
号一样,代表输出的格式化设置。
c 这是Fortran的hello world程序
PROGRAM Example
write(*,*) 'hello world'
write(*,*) 'hello 我是write'
print *, 'hello 我是print'
END
out:
hello world
hello 我是write
hello 我是print
编码格式:在这里需要注意项目的编码格式,为了对照以前的项目,这里将编码格式设置为GB 2312
输入
- read,*的用法和write基本一致。
c read类似于python中的input方法
PROGRAM Example
read(*,*) a
write(*,*) a
END
out:
10(输入)
10.0000000(输出)
上文中提到的格式化:(具体的网上很多了,在这里只贴常用的“ I 、F、E、A、X ”这几个格式)
-
Iw[.m]
以w个字符的宽度来输出整数,至少输出m个数字。如:write(*,“(I5)”) 100
输出:_ _100
; 不足补空格 。 -
Fw.d
以w个字符文本框来输出浮点数,小数部分占d个字符宽,输出文本框的设置不足显示*号。如:write(*,“(F9.3)”) 123.45
输出:_ _123.450
; 不足补空格,小数不足补0。 -
Ew.d[Ee]
用科学计数法,以w个字符宽来输出浮点数,小数部分占d个字符宽,指数部分最少输出e个数字。如:write(*,“(E15.7)” 123.45
输出:_ _0.1234500E+03
; 不足部分补空格,小数部分不足补0。 -
Aw
以w个字符宽来输出字符串。 如:write(*,“(A10)”) “Hello”
输出:_ _ _ _ _Hello
。 -
nX
输出位置向右移动n位。如:write(*,“(5X,I3)”) 100
输出:_ _ _ _ _100
。
读写文件
I/O语句 | 用途 |
OPEN | 将一个文件与另一个给定的I/O单元号关联起来 |
CLOSE | 关闭一个文件并释放与之关联的I/O单元号 |
REWIND | 倒回文件,一般用于倒回临时文件 |
open
- 语句:
OPEN(open_list)
,其中open_list
是一组子句,分别指定I/O单元号、文件名和关于存储文件的信息,其特性有:
- 子句的顺序可以是任意的;
- 子句用逗号
,
隔开
open_list
含有很多子句,以下6项比较重要:
UNIT = int_expression
,指明与文件关联的I/O单元号,int_expression
为非负的整数值;FILE = char_expression
,指定要打开的文件名,char_expression
为文件名称的字符值;STATUS = char_expression
,指定要打开文件的状态,char_expression
的取值为下列中的一个:OLD
,NEW
,REPLACE
,SCRATCH
或UNKNOW
;
补充知识:
STATUS='NEW'
表示这个文件原本不存在,是第一次打开STATUS='OLD'
表示这个文件原本就已经存在STATUS='REPLACE'
文件若已经存在,会重新创建一次,原本的内容会消失。文件若不存在,会创建新文件。STATUS='SCRATCH'
打开一个暂存文件,暂存文件是临时文件,当关闭或终止程序时,文件将被删除。这时不需要指定文件名称,也就是FILE这一栏可以省略,因为程序本身会自动取一个文件名。STATUS='UNKNOWN'
缺省时的默认值, 文件存在则打开,不存在则创建,相当于NEW
与OLD
的综合利用。
ACTION = char_expression
,指定文件以读或写的方式打开,char_expression
的取值为下列中的一个:READ
,WRITE
或READWRITE
,如未指定则是以读写方式打开;IOSTAT = int_variable
,指定一个整数变量名,把打开操作的状态返回到这个int_variable
变量中。如果OPEN
语句成功执行,则整数变量int_variable
的值为0,其它数值则是未成功执行(不同处理器,相应系统错误信息会不同);IOMSG = char_variable
,指定一个字符变量名。如果OPEN
语句成功执行,字符变量char_variable
的内容不会变化,如没成功执行,一个描述错误的信息将返回到该字符串中。
close
- 语句:
CLOSE( close_list )
,close_list
必须包含一个指定I/O单元号的子句,还可以指定其它选项。特性:
- 文件关闭后,相关联的I/O单元被释放,可以用
OPEN
将该单元号重新分配给其它任意文件; - 如果程序中没有包含对给定文件的
CLOSE
语句,这个文件将在程序结束时被自动关闭。
总结(结合项目)
以Highspeedball
程序为例,代码OPEN(5,FILE='INPUT.DAT',STATUS='OLD')
解析:
-
5
:I/O单元号(但不建议用10以内的数) -
FILE='INPUT.DAT'
:要打开的文件名 -
STATUS='OLD'
:表示这个文件原本就已经存在
参照Highspeedball
代码,对TAPER_A读写程序进行改写,改写后代码成功运行:
c 文件成功案例1:
c 文件的读写
Program MAIN
real :: a,b,c,d,e,f,g !real型
real :: h,i,j,k,l,m,n,o
open(Unit = 15,File='INPUT.dat')
read(15,*) a,b,c,d,e,f,g
write(*,*) a,b,c,d,e,f,g
read(15,*) h,i,j,k,l,m,n,o
write(*,*) h,i,j,k,l,m,n,o
END Program MAIN
out:
16.0000000 2.22250000E-02 0.125249997 40.0000000 0.523000002 0.523000002 9.99999975E-05
0.300000012 0.300000012 0.300000012 2.04999999E+11 2.04999999E+11 2.04999999E+11 7800.00000 1.00000000
**附录:**在查询B站资料( Fortran文件读写 )时,了解到另一套写法,但具体原理尚未研究,代码及运行结果如下(需将INPUT.DAT改成4*7数组):
c 文件成功案例2
Program MAIN
implicit None
real :: a(7,4)
integer :: FILE_IN,i
open(NewUnit = FILE_IN,File='INPUT.dat')
Do i =1, size(a,dim=2)
read(FILE_IN,*) a(:,i)
write(*,*) a(:,i)
end do
close(FILE_IN)
END Program MAIN
out:
16.0000000 2.22250000E-02 0.125249997 40.0000000 0.523000002 0.523000002 9.99999975E-05
0.300000012 0.300000012 0.300000012 2.04999999E+11 2.04999999E+11 2.04999999E+11 7800.00000
1.00000000 0.00000000 1000.00000 30000.0000 0.00000000 0.00000000 0.00000000
0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000