Formatted I/O in Depth
19.1 Edit descriptors
integer, width w (m min digits) integer, minimal width f8.3 → 3.142 minimal width fixed Ew.d, Ew.dEe e12.4 → 0.3142E+01 scientific (1 digit before point) es12.4 → 3.1416E+00 engineering (exponent multiple of 3) en12.3 → 3.142E+00 general (chooses F or E) g0 → minimal representation Bw, Ow, Zw binary, octal, hex b8 → 00101010 Tn, TLn, TRn tab to column / left / right new record (line) stop if no more items *(i0,:, ", ") print/suppress plus sign blanks null/zero on input RN, RZ, RU, RD user-defined derived-type I/O
19.2 Repetition & format reuse
write(*, '(3i5)') 1, 2, 3 ! repeat count
write(*, '(2(a, ": ", f6.2, 3x))') "x", 1.0, "y", 2.0 ! grouped repeat
write(*, '(*(f6.2))') arr ! unlimited repeat (F2008)
character(len=*), parameter :: fmt = '(a, t15, f10.3)'
write(*, fmt) "Energy", e
write(*, 100) n, x
100 format('n = ', i0, ', x = ', es10.3) ! labeled FORMAT statement (legacy style)19.3 Printing tables & matrices
do i = 1, size(A, 1)
write(*, '(*(f8.3, 1x))') A(i, :) ! one matrix row per line
end do
write(*, '(a10, a12, a12)') "n", "x", "f(x)"
write(*, '(i10, 2es12.4)') (k, x(k), f(k), k = 1, n) ! implied-do in an I/O list19.4 User-defined derived-type I/O (F2003)
type :: point
real :: x, y
contains
procedure :: write_point
generic :: write(formatted) => write_point
end type point
! subroutine write_point(dtv, unit, iotype, v_list, iostat, iomsg) ...
! print '(dt)', p