格式化输出
使用格式化使得读取和写入的数据更加美观,Fortran的格式描述符使用"()"
包围
常用格式描述符
格式类型 | 格式符 | 说明 |
---|---|---|
整数 | i | 需要加宽度,例如i10 ,表示宽度是10 |
浮点数 | f | 需要加宽度和小数点后位数,例如f10.5 ,表示宽度是10,小数点后5位 |
科学计数法 | es | 需要加宽度、小数点后位数和科学计数的指数,例如es24.15e3 ,表示宽度是24,小数点后15位,指数3位 |
字符 | A | 可以加宽度,例如a3 ,标识宽度是3 |
通用格式 | g0 | 输出时使用,适用于任意类型 |
空格 | x | 输出一个空格 |
Fortran支持在每个描述符的前面添加次数标记,例如10i3
,20(f10.5,i10)
,这样就可以多层嵌套,组合出更多的格式。
同时可以使用*
作为标记次数,此时表示的是能输出的最大次数
write(*,"(i3)")123
write(*,"(3f10.4)")[1.0,2.0,3.0]
write(*,"(*(g0,1x)"))1.0,"hello",2
"(*(g0,1x)")
和Fortran的默认输出*
看起来似乎是相同的功能。事实上不同的编译器对于*
的实现各不相同,例如gfortran
的输出中有大量的空格,ifort,ifx
在80个字符后会自动换行,使用这个格式就可以保证用最小的宽度输出。
如果格式的次数比后面需要输出的参数要少,那此时会自动换行
real::a(3,3)
write(*,"(3f10.4)")a !此时输出的是一个3*3的矩阵形式
在默认格式*
中,每个read
会至少读取一行,所以一个空的read
可以跳过当前行,一个非空的read
可以跳过连续的空行,而read
后如果是一个数组或者多个元素,则它会一直向后读取直到所有元素全部读取。
!读取一个数组
real::a(10,10)
read(10,*)a !文件中至少需要100个real型数字
- 建议在
read
的过程中尽量不要使用格式,因为它要求你的格式和你的文件内容完全符合,这样丧失了一定的灵活性。直接使用表控格式读取更加灵活。 - 在读取字符串的时候,默认会按照分隔符分割,此时使用格式
A
就可以读取一行中所有的字符read(10,"(A)")
,使用"(A)"
格式就可以解决我们上一节提到的空行的问题。
内部文件读写(数字和字符串互转)
write(*,*)
和read(*,*)
的第一个位置也可以填写字符串,用于数字和字符串的相互转换
character(len=10)::str
real::a
write(str,"(f10.2)")1.234
read(str,*)a
- 注意到Fortran的文件名是一个字符串,所以可以用内部文件读写来批量的生成文件名