Esempio:
open(unit=1, file='posizioni.dat')
farà in modo che le operazioni di scrittura relative a unit 1 corrispondano a scrivere sul file di nome posizioni.dat.
Altri possibili parametri sono:
iostat=ios ios: variabile intera di
default. Il valore zero indica che l' apertura del
file è riuscita mentre un valore diverso da zero segnala
errore.
iomsg=msg msg: variabile di tipo character che conterrà una frase di descrizione del tipo di errore.
action=act act: stringa che specifica le
azioni di trasferimento permesse per l' unità in questione.
Possibili
valori: "read" (solo lettura,
non sono possibili istruzioni di scrittura),
"write" (solo scrittura, no
operazioni di lettura) e "readwrite"
(sia scrittura sia
lettura). Il default dipende dall' implementazione;
access=acc
acc: stringa che specifica il tipo di file Fortran associato
all' unità. I possibili tipi sono: "sequential" (il default, ogni record viene
acceduto in sequenza dopo tutti i precedenti),
"direct" (i record sono
numerati e possono essre letti o scritti in qualsiasi ordine, senza
passare per i record precedenti) e "stream"
(senza record; il file corrrisponde ad una sequenza non strutturata di
byte);
status=s s: stringa che
specifica lo
stato del file connesso all' unità logica. Possibil valori: "old" (il file deve già
esistere), "new" (il file non
deve esistere,
viene creato dall' istruzione open), "scratch"
(il
file verrà creato e connesso all' unità logica ma
sarà cancellato all' istruzione close o al termine del
programma), "replace" (il file
viene creato se
non esiste ma viene cancellato e ricreato se già esistente), "unknown" (il
default, dipendente dall' implementazione del compilatore).
Altri parametri opzionali (far riferimento ad un manuale per la lista
completa)
form=fm dove
fm è una stringa che denota se il
file è
formattato (fm="formatted" ) o
non formattato (fm="unformatted" ).
Un file è formattato quando i dati in esso contenuti sono stati
scritti sotto forma di caratteri. Un file non formattato invece
contiene dati non convertiti, nella stessa rappresentazione usata
internamente in memoria. Il default è formatted per i file
sequenziali e unformatted per i file ad accesso diretto.
recl=rl dove
rl è un intero che esprime la lunghezza di un record
(la massima lunghezza per file sequenziali; è
obbligatorio per file ad accesso diretto).
L' istruzione close(unit=u) o
close(u)
chiude l' associazione tra unità
logica u e file esterno.
Permettendo, tra l' altro, il riutilizzo del numero di unità
logica
per la connessione con un nuovo file.
Istruzioni I/O con formato
esplicito
Soprattutto nella scrittura può
essere
utile, nel caso di file formattati, poter agire direttamente sulla
conversione dei dati dalla rappresentazione interna a quella sotto
forma
di stringhe di caratteri.
Una specifica di formato è una stringa che va assegnata alla
keyword
fmt nelle istruzioni di scrittura (anche in quelle di lettura, volendo,
ma per queste si rimanda ad un manuale sul linguaggio).
I principali descrittori di formato sono:
- ES per reali in notazione
scientifica. Utilizzo:
ESw.d (dove w e d sono interi che rappresentano l' ampiezza
totale in caratteri del campo e il numero di cifre dopo il punto
decimale; w >= 7+d)
- F per reali in
notazione a virgola mobile.
Utilizzo: Fw.d. Se il numero richiede più
cifre di
quelle rappreentabili nel campo, verra' scritto come asterischi a
meno di non usare w=0. In tal caso il campo varrà ampliato
fino a poter rappresentare completamente il numero.
- I per interi:
Iw.m l' intero m, se presente indica il numero
minimo di cifre da scrivere (se l' intero ha meno cifre, vengono
scritti degli zeri prima della cifra più significativa.
- L per logici: Lw
- A per caratteri :
An chiede di scrivere
n caratteri. A senza indicatori fa scrivere una stringa per
l' intera lunghezza dichiarata.
- X per
spazi : nX lascia
n spazi
- T per scrivere il
campo successivo dalla
colonna c: Tc
- TR o TL per lasciare spazi bianchi a
destra (o sinistra) dell' ultima posizione di
scrittura
- / per
andare a capo
Ciascun descrittore può essere preceduto da un intero che
indica il numero di dati a cui va applicato quel
descrittore. Esempio:
write(unit=1, fmt="(tr15,f10.2,i5,2es16.6)") a,b,c,d
scrive sulla riga di output 4 variabili. la prima (a) deve essere reale
(descrittore f10.2) e viene scritta in un campo totale di 10 caratteri,
di cui 2 dedicati alle cifre a destra del punto decimale. Il numero
viene scritto dopo aver lasciato 15 spazi a destra del carattere
di inizio del record (tr15). Il secondo dato (b) deve essere un
intero (descrittore i5) scritto in un campo di ampiezza 5
caratteri ed infine ci devono essere due reali (c e d) che
saranno scritti in notazione scientifica
(mantissa ed esponente di 10) in un campo di complessivi 16 caratteri
ciascuno (incluso il campo per l' esponente) di cui 6 dedicati alla
parte
decimale della mantissa del numero.
esempi di uso del formato ES
valore
|
format
|
output
|
21.215
|
es14.6
|
2.121500e+01
|
82321.3
|
es10.2
|
8.23e+4
|
-0.53
|
es12.2
|
-5.30e-01
|
0.000229
|
es14.1e4
|
2.3e-0004
|
Nelle situazioni in cui non si vuole controllare direttamente il formato è
sufficiente usare il parametro fmt=*. Attenzione: si tratta sempre di I/O formattato, solo la trasformazione da/verso caratteri viene controllata da decisioni prese da chi ha disegnato il compilatore. Il nome tecnico per tale situazione è di "formato controllato dalla lista" (list directed format), nel senso che è la lista delle espressioni o delle variabili che controlla, attraverso il tipo dati di ogni elemento, il tipo di conversione.
Input/output non formattato
Se l' unità di I/O è stata aperta in
modalità unformatted o, in assenza di open, se l'
istruzione read o write non contengono il parametro
fmt=..., l' I/O avviene in modalità unformatted.
Es:
...
real, dimension(10000) :: x
...
write(unit=10)x
...
crea un file di nome fort.10 (sistemi
unix) contenente le componenti dell' array x nella
rappresentazione del sistema per numeri "real".
Controllo delle condizioni di errore
Durante le istruzioni di I/O è
possibile gestire eventuali errori via software a partire dal parametro
iostat.
Dichiarando una variabile intera di default (ios), un' istruzioni come:
read(unit=1,fmt=*,iostat=ios)x,y,z
ritorna attraverso il valore di ios informazioni su eventuali
condizioni di errore in lettura. In particolare:
ios=0 indica lettura andata a buon fine
ios<0 indica le condizioni di end-of-file oppure end-of-record
(per file ad accesso diretto)
ios>0 indica condizioni di errore generate da errori nell'
indicazione del formato (per I/O formattato non list-directed)
Un esempio di utilizzo di questo parametro per contare i record (o
linee) di un file è il seguente
...
integer :: ios
...
lines=0
do
read(unit=1,fmt='(A)',iostat=ios)
if(ios < 0)exit
lines=lines+1
end do
rewind 1 ! riposiziona l' unità 1 all' inizio per poter eventualmente leggere il
! contenuto del file sapendo qual è il numero dei record/linee.
...