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 list

19.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