I file in Fortran
I file si possono leggere in Fortran usando istruzioni simili a quelle di
Java. Il seguente programma rfile.f90 apre il file
prova.txt, legge tre interi da esso, e li stampa a schermo.
PROGRAM prova
IMPLICIT NONE ! non richiesto se non ci sono variabili
INTEGER :: x, y, z, w
OPEN(unit=0, file="prova.txt")
! i8 significa: i prossimi otto caratteri vengono letti come un intero
! le parentesi delimitano una riga, quindi (i8,i8) (i8) significa:
! leggi i primi due interi da una riga, poi un intero dalla succesiva
READ (unit=0, fmt="(i8,i8) (i8)") x, y, w
! legge da nuova riga
READ (unit=0, fmt="(i8)") z
! per esempio, se il file prova.txt e':
! 1 6 9
! 3
! 41
! allora x=1 y=6 (il 9 viene ignorato) w=3 z=41
! iterazione di formato: 2i8 significa: due volte i8
WRITE (*, fmt="(2i8) (i8)") x, y, w
WRITE (*, fmt="(i8)") z
STOP
END PROGRAM prova
Nel dettaglio, quello che le varie istruzione fanno:
- OPEN(unit=0, file="prova.txt")
- apre il file prova.txt e gli assegna il numero 0; ogni
volta che va aperto un file, occorre scegliere un numero da assegnargli
- READ (unit=0, ...) ...
- questa istruzione legge dal file a cui è stato assegnato il numero
0; il resto dell'istruzione viene ora illustrato nel dettaglio
- READ (unit=0, ...) x, y, w
- quello che viene letto va nelle variabili x, y, w
- READ (unit=0, fmt="(i8,i8) (i8)") x, y, w
- La parte fmt= è la stringa di formato; questa stringa dice
come sono scritti i dati sul file; in particolare:
- i8 significa "un intero che occupa otto caratteri"
- (i8,i8) significa: una riga che contiene un intero nei primi otto
caratteri e un intero nei successivi otto
- (i8) significa: una riga che contiene un intero nei primi otto
caratteri
Complessivamente, la stringa fmt="(i8,i8) (i8)" fa sì che
vengano letti:
- dalla prima riga: i primi otto caratteri vengono letti come interi e vanno
nella variabile x; i secondi otto vanno in y; gli altri
vengono ignorati
- dalla seconda riga: i primi otto caratteri vanno in w, gli altri
vengono ignorati
- WRITE (*, fmt="(2i8) (i8)") x, y, w
- scrive i valori di x, y, w a schermo; vengono ora analizzate nel
dettaglio le varie parti di questa istruzione
- WRITE (*, fmt="(2i8) (i8)") x, y, w
- la stampa avviene su schermo perchè si è usato *;
se al posto dell'asterisco si fosse usato unit=n allora la stampa
sarebbe stata fatta sul file di numero n
- WRITE (*, fmt="(2i8) (i8)") x, y, w
- la stringa di formato è simile a quella della lettura
- i8 indica che un intero viene stampato occupando 8 caratteri (se
l'intero è più corto, si mettono spazi per completare gli otto
caratteri);
- 2i8è equivalente a i8,i8 (si può fare la
stessa cosa anche in lettura);
- le parentesi indicano una linea: (2i8) (i8) indicano di stampare
due interi nella prima linea e uno nella seconda