PROGRAM File_Binario_Diretto
!-------------------------------------------------------------------------
! Converte un file di testo a binario con accesso diretto.
! Il primo record del file contiene il numero di dati.
!-------------------------------------------------------------------------
  IMPLICIT NONE
  CHARACTER(LEN=10)    :: nome
  INTEGER,DIMENSION(5) :: voti
  INTEGER              :: ok, iol, n

!-- Archivio in formato testo
  OPEN (UNIT=1, FILE='archivio.txt')
!-- Archivio binario ad accesso diretto
  INQUIRE(IOLENGTH=iol) nome, voti            ! Determina lunghezza record
!   In questa forma, INQUIRE restituisce come IOLENGTH l'occupazione di
!   memoria della lista.
  OPEN (UNIT=2, FILE='archivio.dat', STATUS='REPLACE', FORM='UNFORMATTED' &
      , ACCESS='DIRECT', RECL=iol)
!   Valori di ACCESS: 'SEQUENTIAL', default
!                     'DIRECT'
!   Un file ad accesso diretto ha record di lunghezza fissa,
!   definita da RECL.

  DO n=0,HUGE(0)                    ! Conta i record letti, fino alla fine
!     HUGE: funzione intrinseca che restituisce il massimo valore del
!     tipo corrispondente all'argomento (in questo caso intero).
    READ(1,*,IOSTAT=ok) nome, voti  ! Controlla condizione errore (EOF)
    IF (ok/=0)  EXIT
!     Si noti l'uso di EXIT in presenza di un contatore
    WRITE(2,REC=n+2) nome, voti     ! Scrivi a partire dalla posizione 2
  END DO
  WRITE(2,REC=1) n                  ! Scrivi la lunghezza nel primo record
  STOP
END PROGRAM File_Binario_Diretto
