Fortran系列:
fortran
的输入输出函数有三种,即read, print, write
,其标准调用方式如下,其中fmt
表示输入输出的字符格式,如果不想设置可以记作*
,前几节一直调用的print *,
就是这种情况。
print fmt, variable_list
read fmt, variable_list
write fmt, variable_list
为了便于理解,这里先用print
作为示例,等到后面介绍文件读写的时候,再用read, write
。
fmt
的本质是一段字符串,例如
print "(f6.3)", 3.1415926
结果为3.142
其中f
表示浮点型,下表列出fortran
所有的交互格式
类型 | 格式 |
---|---|
ingeger | ri w.m |
character | rA w |
real | rF w.d, rE w.d, rES w.d |
空 | 空格nX ;空行/ |
其中个参数含义为i
表示整数;F
表示浮点数;E
, ES
表示科学计数法。其他数字表示
- d 右侧的小数位数
- m 要显示的最小位数
- n 跳过的空格数
- r 左侧空格
- w 字段宽度
一般当字符宽度w
不足以打印设置格式的长度时,会返回长为w
的星号,例如
program printPi
pi = 3.141592653589793238
print "(f6.3)", pi
print "(f4.3)", pi
print "(f10.7)", pi
print "(f20.15)", pi
print "(e16.4)", pi/100
end program printPi
结果为
3.142
****
3.1415927
3.141592741012573
0.3142E-01
f4.3
表示保留3位小数的同时,宽度为4,这显然是不够的,所以变成了4个星号。
f20.15
表示保留15位小数,同时占据20个字符的宽度,所以前面出现了3个空格。
打开文件
fortran
用open
打开文件,其参数列表如下
unit
取值为0-999的数字,作为文件的标识符,每个标识符只能对应一个文件file
文件名,为字符串ioStat
I/O状态,为整型err
错误status
默认为'unknown'
;若为new
表示该文件不存在;old
表示该文件已存在,replace
表示覆盖原本的文件,'scratch’表示创建临时文件,不需要文件名access
默认"sequential"
,表示顺序读写;若设为'direct'
,则可指定任意位置读写form
'formatted'
表示存为文本文件;unformatted
表示存为二进制recl
文件字节长度
其中,unit
和file
为必选参数。
在对文件内容执行完操作后,通过close(unit)
来关闭文件。
program fileTest
implicit none
real, dimension(100) :: x, y
integer :: i
do i=1,100
x(i) = i * 0.1
y(i) = sin(x(i))
end do
open(1, file = 'test.txt', status = 'new')
do i=1,100
write(1,*) x(i), y(i)
end do
close(1)
end program fileTest
在当前工作目录下,出现test.txt
,内容为
0.100000001 9.98334214E-02
0.200000003 0.198669329
0.300000012 0.295520216
...
文件读写
上面的案例中出现了write(1,*)
,此即写入文件的方法,其主要参数为write(unit, fmt)
,其中unit
即文件标识符,fmt
则与print
中的fmt
如出一辙,表示写入格式,如果将上面的写入代码改为
write(1,"f4.2") x(i)
则其内容变为
0.10
0.20
0.30
...
所以这里就出现了一个问题,fmt
貌似只能对单个写入进行格式化。
但作为经典编程语言,这个bug还是很容易解决的,只需外挂格式,将write
这行改写为
write(1,100) x(i), y(i)
100 FORMAT(' ' , f6.2, 2f8.4)
效果为
0.10 0.0998
0.20 0.1987
0.30 0.2955
0.40 0.3894
0.50 0.4794
...