格式化输出

使用格式化使得读取和写入的数据更加美观,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的文件名是一个字符串,所以可以用内部文件读写来批量的生成文件名