Utilizzo dei file
In FORTRAN è possibile utilizzare i file per salvare l'output di un programma, così come per far leggere al programma gli input da file. Di seguito è spiegato come adoperare i file in un programma.
Prima di poter utilizzare un file, questo deve essere aperto
con l'istruzione:
OPEN(UNIT=n,FILE=nome)
A questo punto è possibile eseguire le operazioni di lettura scrittura sul file,
quindi, quando non è più necessario utilizzare il file, e comunque prima della
fine del programma, il file deve essere chiuso con il seguente comando:
CLOSE(UNIT=n)
n è un numero intero che indica
l'unità logica e nome è l'nome del file, che essendo una stringa di
caratteri va messa tra apici. n coincide in OPEN e CLOSE.
n stabilisce la corrispondenza biunivoca tra l'operazione di apertura del
file e le operazioni di lettura/scrittura e chiusura del file.
In seguito
alla chiusura, il numero di unità logica n può essere utilizzato per
un'altra l'apertura.
È permesso, dopo la chiusura di un file, riaprirlo per
potervi riaccedere.
Esempio:
OPEN(UNIT=1,FILE='DATI')
..................................
CLOSE(UNIT=1)
La precedente è la forma più semplice per aprire un file. Si
noti che se si verifica un errore durante l'apertura del file il programma non
può lavorare. Per contemplare tale problema in fase di stesura del programma, si
inserisce nell'istruzione OPEN il parametro ERR:
OPEN(UNIT=n,FILE=nome,ERR=etichetta)
Se si verifica un errore durante l'apertura del file viene eseguita l'istruzione
etichettata con etichetta, altrimenti
viene regolarmente aperto il file.
L'istruzione completa di OPEN è:
OPEN(UNIT=n,FILE=nome,ERR=etichetta,STATUS=stato)
Dove stato può assumere i valori 'OLD', 'NEW' e 'UNKNOWN' (gli apici
vanno messi), che indicano rispettivamente che il file già esiste, il file deve
essere creato, non si sa se il file esiste o meno, se questo esiste viene
aperto, se non esiste viene creato e poi aperto. Se STATUS viene omesso, allora
si assume che sia stato='UNKNOWN'.
Esempio:
OPEN(UNIT=1,FILE='DATI',ERR=10,STATUS='NEW')
..................................
CLOSE(UNIT=1)
..................................
10 CONTINUE
PRINT*,'Errore durante l'apertura del file'
END
Per poter ora scrivere nel file
che è stato aperto si adopera la seguente istruzione:
WRITE(UNIT=n,FMT=formato1)id1
dove n è l'unità
logica che è stata assegnata in fase di apertura
al file, formato1 è un etichetta che
rimanda ad un'istruzione di tipo FORMAT, che
stabilisce il formato in cui scrivere i dati sul file, e id1 è l'identificatore
della variabile da scrivere sul file. Per l'output su file è obbligatoria
l'istruzione FORMAT, a differenza di quanto
accadeva per PRINT.
Esempio:
OPEN(UNIT=1,FILE='DATI',ERR=10,STATUS='NEW')
..................................
WRITE(UNIT=1,FMT=50)X
..................................
CLOSE(UNIT=1)
..................................
50 FORMAT(F6.3)
..................................
10 CONTINUE
PRINT*,'Errore durante l'apertura del file'
END
Per poter leggere da un file (già contenente dei dati)
che è stato aperto si adopera la seguente istruzione:
READ(UNIT=n,FMT=formato2)id2
dove n è l'unità
logica che è stata assegnata in fase di apertura
al file, formato2 è un etichetta che
rimanda ad un'istruzione di tipo FORMAT, che
stabilisce con quale formato leggere i dati scritti nel file, e id2 è l'identificatore
della variabile nella quale inserire i dati letti dal file. Per l'input da file
è obbligatoria l'istruzione FORMAT, a differenza di
quanto accadeva per READ, si faccia attenzione al
fatto che formato2 deve essere il formato con cui sono stati scritti i
dati nel file, altrimenti i dati letti con un altro formato sarebbero differenti
dai dati. Esempio: siano
15902576°281°120
i dati contenuti nel file scritti
nel formato 8I2 (dove con ° si indica uno spazio vuoto dovuto al formato, vedi
FORMAT I). Leggendo i dati contenuti nel file con il formato I2 e
inserendoli in un array A (dimensionato opportunamente)
si ha nell'array:
A(1)=15
A(2)=90 A(3)=25
A(4)=76 A(5)=2
A(6)=81 A(7)=1
A(8)=20
mentre leggendo i dati con il formato 4I4 e
inserendoli in un array B (dimensionato opportunamente)
si ha nell'array:
B(1)=1590
B(2)=2576 B(3)=281
B(4)=120
Il file ha una lunghezza finita, quindi i dati ad un certo
punto finiranno e se il programma tenta di leggere oltre la fine del file si
genera un errore. In alcuni casi può non essere noto a priori il numero di dati
contenuti nel file, in tal caso è utile fare in modo che il programma si accorga
da solo quando i dati sono finiti. Per questo motivo si inserisce
nell'istruzione READ il parametro END:
READ(UNIT=n,FMT=formato2,END=etic)id2
Fino a che
non è stato raggiunto il termine del file, il computer continua a leggerlo, non
appena finiscono i dati viene eseguita l'istruzione
etichettata con etic (e quindi tutte le successive).
Esempio:
OPEN(UNIT=1,FILE='DATI',ERR=90)
..................................
I=1
10 CONTINUE
READ(UNIT=1,FMT=50,END=70)X(I)
I=I+1
GOTO 10
70 CONTINUE
N=I-1
PRINT*,'Sono stati letti',N,'dati'
..................................
CLOSE(UNIT=1)
..................................
50 FORMAT(F6.3)
..................................
90 CONTINUE
PRINT*,'Errore durante l'apertura del file'
END