Operazioni di input e output in Fortran 90 Ing. Luca De Santis DIS - Dipartimento di informatica e sistemistica Anno accademico 2006/2007 Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 1 / 28
Cosa vedremo in questa lezione 1 Concetti fondamentali sui file 2 Gestire i file con il Fortran 90 3 Esempi di applicazioni 4 Formattazione dell input e dell output Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 2 / 28
Concetti fondamentali sui file File: concetti fondamentali File: sequenza di elementi (ad es. caratteri) memorizzati in memoria secondaria. File di testo: qualsiasi cosa che possa essere letta da tastiera o scritta su video in chiaro, senza decodifica (interi, reali, caratteri,... ). Disciplina d accesso maniera di accedere ai dati: sequenziale = dal primo ai successivi, in sequenza casuale ad uno qualsiasi, in ogni momento Questi concetti sono indipendenti dal linguaggio di programmazione Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 3 / 28
Concetti fondamentali sui file I file e il sistema operativo I dati in un PC sono gestiti attraverso il file system Solitamente con struttura gerarchica Il file system associa ad ogni porzione di dati memorizzati un nome fisico (stringa di caratteri + estensione) A volte il sistema operativo impone restrizioni su: Lunghezza stringa, ad es. in DOS max 8 caratteri + estensione (limitazione superata con i nuovi sistemi operativi) Uso maiuscole/minuscole (ad es. DOS è case-insensitive) Al nome fisico di un file può corrispondere un nome logico, definito ad esempio internamente ad un programma Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 4 / 28
Concetti fondamentali sui file Operazioni principali su un file Apertura di un file: creare accoppiamento nome logico/nome fisico in: Sola lettura In Fortran 90 ogni riga del file viene chiamata record Sola scrittura: modalità NEW : il file non esiste, viene creato modalità REPLACE : il file (esistente o no) viene riscritto, cancellando il contenuto vecchio Lettura/scrittura Chiusura di un file: eliminare l accoppiamento. Lettura di dati (in file da cui la lettura è ammessa) Scrittura di dati (in file su cui la scrittura è ammessa) Anche queste operazioni sono indipendenti dal linguaggio di programmazione! Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 5 / 28
Gestire i file con il Fortran 90 Restrizioni Il Fortran 90 consente di associare un nome logico ad un file fisico gestito dal sistema operativo Astrazione dal dispositivo e dalla tecnologia Il file logico viene detto dispositivo logico o anche dispositivo Il nome del dispositivo logico deve essere una costante di tipo INTEGER, che viene chiamata unità I compilatori riservano alcuni numeri a dispositivi standard In questo corso ci occuperemo: Solo file di testo No file in lettura/scrittura Solo file ad accesso sequenziale Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 6 / 28
Gestire i file con il Fortran 90 Apertura di un file L associazione di un dispositivo logico ad un file fisico per la lettura avviene attraverso l istruzione: OPEN(lista open) Occorre specificare le seguenti clausole: UNIT: nome logico (intero non negativo) FILE: nome fisico (stringa di caratteri) STATUS: può assumere i seguenti valori: OLD : sola lettura NEW : sola scrittura; il file non deve esistere, e viene creato REPLACE : sola scrittura esistente o no, il file viene (ri)scritto; SCRATCH : file temporaneo, non viene salvato su disco Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 7 / 28
Gestire i file con il Fortran 90 Apertura di un file (cont.) ACTION: READ o WRITE. IOSTAT: variabile di tipo intero, memorizza eventi particolari: Forma IOSTAT = nome variabile L apertura di un dispositivo fisico e la lettura dei record può generare errori La variabile (IOSTAT) consente di controllare lo stato delle operazioni: Se c è errore nell operazione (ad esempio, un file in lettura non esiste, fine file in lettura record o errore in lettura record) nome variabile /= 0; Se tutto è andato a buon fine: nome variabile == 0; Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 8 / 28
Gestire i file con il Fortran 90 Altre operazioni su file Chiusura: CLOSE(unità) Lettura: READ(unità, formato, variabile iostat) Scrittura: WRITE(unità, formato ) Riposiziona all inizio: REWIND(unità) Record precedente: BACKSPACE(unità) Esempi: INTEGER : : i o s t a t OPEN(UNIT=5, FILE= esempio. tmp, STATUS= NEW, ACTION= WRITE, IOSTAT=i o s t a t ) OPEN(UNIT=12, STATUS= SCRATCH, IOSTAT=i o s t a t ) OPEN(UNIT=8, FILE= d a t i. dat, STATUS= OLD, ACTION= READ, IOSTAT=i o s t a t )... CLOSE( 5 )! c h i u d o i l d i s p o s i t i v o a s s o c i a t o a l l u n i t à 5 READ( 8, ) a, b, c! l e g g o un r e c o r d d e l f i l e d a t i. dat WRITE( 5, ) a! s c r i v o su esempio. tmp l a v a r i a b i l e a REWIND( 8 )! r i t o r n o a l primo r e c o r d d e l d i s p o s i t i v o 8 Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 9 / 28
Esempi di applicazioni Somma di interi da file 1 PROGRAM s o m m a f i l e 2! Questo programma l e g g e un f i l e che c o n t i e n e numeri i n t e r i e ne c a l c o l a l a somma 3! I l f i l e ha nome f i s i c o d a t i. t x t 4! SEZIONE DICHIARATIVA 5 IMPLICIT NONE 6 CHARACTER( 8 ), PARAMETER : : n o m e f i l e = d a t i. t x t! i l nome f i s i c o d e l f i l e 7 INTEGER : : dato! i l dato l e t t o d i v o l t a i n v o l t a 8 INTEGER : : q u a n t i = 0! c o n t a t o r e d e g l i i n t e r i l e t t i 9 INTEGER : : somma = 0! somma d e g l i i n t e r i l e t t i 10 INTEGER : : i s t a t u s! s t a t o I /O 11! SEZIONE ESECUTIVA 12! a p e r t u r a d e l f i l e i n s o l a l e t t u r a 13 WRITE(, ) Leggo d a l f i l e, n o m e f i l e 14 OPEN (UNIT = 9, FILE = nome file, STATUS = OLD, ACTION = READ, IOSTAT = i s t a t u s ) 15 IF ( i s t a t u s == 0) THEN! i l f i l e e s t a t o a p e r t o c o r r e t t a m e n t e 16 DO 17 READ ( 9,,IOSTAT = i s t a t u s ) dato! l e t t u r a d i un dato da f i l e 18 IF ( i s t a t u s /= 0) EXIT! s i e s c e quando i l f i l e e t e r m i n a t o 19 WRITE(, ) dato 20 q u a n t i = q u a n t i + 1 21 somma = somma + dato 22 END DO 23 CLOSE( 9 ) 24 WRITE(, ) I l f i l e e composto d i, q u a n t i, d a t i 25 WRITE(, ) La somma dei d a t i vale, somma 26 ELSE 27! i l f i l e non e s t a t o a p e r t o c o r r e t t a m e n t e 28 WRITE(, ) I l f i l e, n o m e f i l e, non e s i s t e 29 END IF 30 STOP 31 END PROGRAM s o m m a f i l e Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 10 / 28
Righe e caratteri di un file Esempi di applicazioni 1 PROGRAM l e g g i f i l e 2! Questo programma l e g g e un f i l e d i t e s t o e conta d i q u a n t i c a r a t t e r i e quante 3! l i n e e e composto. 4! I l f i l e ha nome f i s i c o i n p u t. t x t! 5 6! I l programma l e g g e una r i g a d e l f i l e p e r o g n i i t e r a z i o n e, immagazzinandola 7! i n una s t r i n g a d i l u n g h e z z a f i s s a t a ( 2 4 0 ). 8! Vengono u s a t i a l c u n i a s p e t t i p e c u l i a r i d e l l e s t r i n g h e : 9! l e t t u r a f o r m a t t a t a con d e s c r i t t o r e d i formato A ( l e g g e t u t t a l a l i n e a ) 10! ( f u n z i o n a anche s e n z a l a f o r m a t t a z i o n e d e l l o p e r a z i o n e d i l e t t u r a ) 11! f u n z i o n e i n t r i n s e c a LEN TRIM ( s ), che r e s t i t u i s c e l a l u n g h e z z a d e l l a s t r i n g a 12! s meno g l i s p a z i v u o t i f i n a l i 13 14! SEZIONE DICHIARATIVA 15 IMPLICIT NONE 16 CHARACTER( 12), PARAMETER : : n o m e f i l e = input. txt 17! i l nome f i s i c o d e l f i l e 18 INTEGER, PARAMETER : : l u n g h e z z a l i n e a = 240 19! l a lunghezza di l i n e a massima ammessa 20 CHARACTER( l u n g h e z z a l i n e a ) : : l i n e a 21! l a l i n e a l e t t a d i v o l t a i n v o l t a 22 INTEGER : : l i n e e = 0! c o n t a t o r e d e l l e l i n e e l e t t e 23 INTEGER : : c a r a t t e r i = 0! c o n t a t o r e d e i c a r a t t e r i l e t t i 24 INTEGER : : i s t a t u s! s t a t o I /O Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 11 / 28
Righe e caratteri di un file(cont.) Esempi di applicazioni 26! SEZIONE ESECUTIVA 27 WRITE(, ) Leggo d a l f i l e, n o m e f i l e 28 OPEN (UNIT = 9, FILE = nome file, STATUS = OLD, ACTION = READ,& 29 &IOSTAT = i s t a t u s ) 30 IF ( i s t a t u s == 0) THEN 31 DO 32 READ ( 9, 1 0 0,IOSTAT = i s t a t u s ) l i n e a! LETTURA d i una l i n e a da f i l e 33 IF ( i s t a t u s /= 0) EXIT 34 WRITE(, ) l i n e a ( 1 : LEN TRIM ( l i n e a ) ) 35 l i n e e = l i n e e + 1 36 c a r a t t e r i = c a r a t t e r i + LEN TRIM( l i n e a ) 37 END DO 38 39 CLOSE( 9 ) 40 WRITE(, ) I l f i l e e composto d i, l i n e e, l i n e e 41 WRITE(, ) e d i, c a r a t t e r i, c a r a t t e r i 42 43 ELSE 44 WRITE(, ) I l f i l e, n o m e f i l e, non e s i s t e 45 END IF 46 100 FORMAT(A) 47 STOP 48 49 END PROGRAM l e g g i f i l e Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 12 / 28
Esempi di applicazioni Copia di un file di testo 1 MODULE o p e r a z i o n i s u f i l e 2 CONTAINS 3 SUBROUTINE c o p i a f i l e ( s o r g e n t e, d e s t i n a z i o n e ) 4! SEZIONE DICHIARATIVA 5 IMPLICIT NONE 6 CHARACTER( l e n = ), INTENT( IN ) : : s o r g e n t e, d e s t i n a z i o n e! nomi f i s i c i d e i f i l e 7! DICHIARAZIONE COSTANTI E VARIABILI LOCALI 8 INTEGER, PARAMETER : : l u n g h e z z a l i n e a = 240! l a massima l u n g h e z z a ammessa 9 CHARACTER( l u n g h e z z a l i n e a ) : : l i n e a! l a l i n e a l e t t a d i v o l t a i n v o l t a 10 INTEGER : : i s t a t u s! s t a t o I /O 11! SEZIONE ESECUTIVA 12 WRITE(, ) Sto c o p i a n d o i l f i l e, s o r g e n t e, n e l f i l e, d e s t i n a z i o n e 13! a p e r t u r a d e l f i l e s o r g e n t e i n l e t t u r a 14 OPEN (UNIT = 9, FILE = sorgente, STATUS = OLD, ACTION = READ, IOSTAT = i s t a t u s ) 15 IF ( i s t a t u s == 0) THEN 16! a p e r t u r a d e l f i l e d e s t i n a z i o n e i n s c r i t t u r a 17 OPEN (UNIT = 10, FILE = destinazione, STATUS = REPLACE, ACTION = WRITE ) 18 DO 19 READ ( 9, 1 0 0,IOSTAT = i s t a t u s ) l i n e a! LETTURA d i una l i n e a da f i l e 20 IF ( i s t a t u s /= 0) EXIT 21 WRITE(10, ) l i n e a ( 1 : LEN TRIM ( l i n e a ) ) 22 END DO 23 CLOSE( 9 ) 24 CLOSE( 1 0 ) 25 ELSE 26 WRITE(, ) I l f i l e, s o r g e n t e, non e s i s t e 27 END IF 28 WRITE(, ) Copia terminata 29 100 FORMAT(A) 30 RETURN 31 END SUBROUTINE c o p i a f i l e Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 13 / 28
Copia di un file di testo(cont.) Esempi di applicazioni 33 SUBROUTINE s t a m p a f i l e ( n o m e f i l e ) 34! SEZIONE DICHIARATIVA 35 IMPLICIT NONE 36! DICHIARAZIONE ARGOMENTI FITTIZI 37 CHARACTER( l e n = ), INTENT( IN ) : : n o m e f i l e! nome f i s i c o d e l f i l e 38! DICHIARAZIONE VARIABILI LOCALI 39 INTEGER, PARAMETER : : l u n g h e z z a l i n e a = 240 40! l a lunghezza di l i n e a massima ammessa 41 CHARACTER( l u n g h e z z a l i n e a ) : : l i n e a 42! l a l i n e a l e t t a d i v o l t a i n v o l t a 43 INTEGER : : i s t a t u s! s t a t o I /O 44! SEZIONE ESECUTIVA 45 OPEN (UNIT = 9, FILE = nome file, STATUS = OLD, ACTION = READ, & 46 &IOSTAT = i s t a t u s ) 47 IF ( i s t a t u s == 0) THEN 48 WRITE(, ) Contenuto d e l f i l e, n o m e f i l e 49 DO 50 READ ( 9, 1 0 0,IOSTAT = i s t a t u s ) l i n e a! LETTURA d i una l i n e a da f i l e 51 IF ( i s t a t u s /= 0) EXIT 52 WRITE(, ) l i n e a ( 1 : LEN TRIM ( l i n e a ) ) 53 END DO 54 CLOSE( 9 ) 55 WRITE(, ) F i n e f i l e, n o m e f i l e 56 ELSE 57 WRITE(, ) I l f i l e, n o m e f i l e, non e s i s t e 58 END IF 59 RETURN 60 100 FORMAT(A) 61 END SUBROUTINE s t a m p a f i l e 62 END MODULE o p e r a z i o n i s u f i l e Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 14 / 28
Formattazione dell input e dell output Stampa in formato libero Stampa in formato libero * come secondo argomento di WRITE(,) (vedere file FORMAT1.F90). Inconvenienti: Molti spazi inutili, Il programmatore non decide quanti siano gli spazi, Inadatta per stampa incolonnata su più righe. INTEGER : : i = 21 REAL : : p i g r e c o = 3.141593 WRITE(, ) i v a l e =, i, ; p i g r e c o v a l e =, p i g r e c o! i v a l e = 2 1 ; p i g r e c o v a l e = 3.14159 Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 15 / 28
Formattazione dell input e dell output Stampa formattata Esempio: WRITE(, 1 0 0 ) i, p i g r e c o 100 FORMAT( i v a l e =, I3, ; p i g r e c o v a l e =, F7. 3 )! i v a l e = 2 1 ; p i g r e c o v a l e = 3. 1 4 2 100: etichetta dell istruzione FORMAT I3: descrittore del formato di un intero in tutto, utilizza 3 caratteri, allineando a destra F7.3: descrittore del formato di un reale in virgola fissa in tutto, utilizza 7 caratteri, di cui 3 dopo il punto e uno per il punto, allineando a destra Note: Arrotondamento del reale stampato, ma non della sua rappresentazione in memoria Necessità dello spazio iniziale nella stringa di FORMAT Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 16 / 28
Formattazione dell input e dell output FORMAT: specifiche alternative Con istruzione FORMAT esplicita: Utile per leggibilità e/o quando deve essere usata almeno due volte Tipicamente: - Tutte insieme alla fine, prima di STOP/RETURN - Singolarmente, dopo il loro primo uso Con stringa costante senza nome: Quando deve essere usata una sola volta Con stringa variabile: - Uso sofisticato, non trattato in questo corso Vedere file FORMAT2.F90 Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 17 / 28
Perchè serve lo spazio all inizio? Formattazione dell input e dell output Bisogna fare riferimento a due concetti Stampante di riga, obsoleta tecnologicamente, ma ancora utile concettualmente Elabora una sola riga da stampare Invia una riga alla stampante Buffer di stampa (buffer di output): formato da: 1 carattere di controllo (il primo); 132 caratteri da stampare (i rimanenti). Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 18 / 28
Il carattere di controllo Formattazione dell input e dell output Valori ammessi per il carattere di controllo (vedere file FORMAT3.F90): CARATTERE SIGNIFICATO 0 Interlinea doppia 1 Salta a nuova pagina + Stampa sulla stessa riga tutti gli altri Stampa normale (compreso SPAZIO) Il carattere di controllo non serve: nel formato libero; nella lettura; nella stampa su file. Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 19 / 28
Formattazione dell input e dell output Carattere di controllo: potenziali problemi INTEGER : : i... i = 21 WRITE(, 1 0 0 ) i!stampa 21 i = 450 WRITE(, 1 0 0 ) i!stampa 50 100 FORMAT( I 3 ) Regola pratica Scrivere sempre il carattere di controllo in modo esplicito nelle istruzioni di formato (vedere file FORMAT4.F90) WRITE(, 2 0 0 ) i!stampa 450 200 FORMAT(, I 3 )!CORRETTA Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 20 / 28
Descrittore I : INTEGER Formattazione dell input e dell output Forma generale riw.m dove r, w ed m sono costanti senza nome di tipo INTEGER (positive) Forme particolari Iw: stampa un intero usando w caratteri (eventuale segno - compreso), allineando a destra Iw.m: come sopra, ma visualizza almeno m cifre oltre -, utilizzando eventualmente degli 0 come cifre più significative riw.m: come la forma precedente, ma con un fattore di ripetizione (formattazione applicata per r volte) Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 21 / 28
Formattazione dell input e dell output Esempi descrittore I (file FORMAT5.F90) i = 12345 WRITE(, 1 0 0 ) i WRITE(, 2 0 0 ) i WRITE(, 3 0 0 ) i, i, i WRITE(, 4 0 0 ) i, i, i 100 FORMAT(, I 2 0 ) 200 FORMAT(, I 2 0. 1 0 ) 300 FORMAT(, 3 I 2 0 ) 400 FORMAT(, 3 I 2 0. 1 0 ) -12345-0000012345 -12345-12345 -12345-0000012345 -0000012345-0000012345 Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 22 / 28
Formattazione dell input e dell output Casi particolari Cosa succede se (vedere file FORMAT6.F90): w è più grande del necessario? Nessun problema: allineamento a destra w è più piccolo del necessario? Stampa w asterischi (Ad esempio, **** ) m è più grande di w? Errore a run-time I dati da stampare non sono interi? Errore a run-time. Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 23 / 28
Formattazione dell input e dell output Casi particolari Cosa succede se (FORMAT7.F90): r è più grande del necessario? Stampa solo gli interi presenti nella WRITE. r è più piccolo del necessario? 1. Stampa i primi r interi presenti nella WRITE sulla stessa riga 2. Poi va a capo e riapplica la FORMAT ai successivi interi presenti nella WRITE Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 24 / 28
Altri descrittori Formattazione dell input e dell output NOTE ALLIN. +--------+------------------------------------------+-----+ REAL rfw.d Virgola fissa D rew.d Virgola mobile, 0.1 <= mantissa < 1.0 D resw.d Virgola mobile, 1.0 <= mantissa < 10.0 D +--------+------------------------------------------+-----+ LOGICAL rlw w >=1 (stampa T o F ) D +--------+------------------------------------------+-----+ CHARACTER raw Stampa w caratteri D ra Stampa tutti i caratteri necessari S +--------+------------------------------------------+-----+ Legenda: r = fattore di ripetizione w = numero di caratteri usati (compresi eventuali., +, -, E ) d = numero di cifre dopo il punto Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 25 / 28
Formattazione dell input e dell output Note sugli altri descrittori w e d sono obbligatori r è opzionale (implicitamente vale 1) per E, ES deve valere w d + 7 w troppo piccolo: F, E, ES stampa w asterischi A stampa i primi w caratteri Vedere file FORMAT8.F90: Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 26 / 28
Formattazione dell input e dell output Altre nozioni su FORMAT Esistono altri descrittori: X, T, /. nx : inserimento di n spazi (non ammesso in Elf90) Tc : permette di raggiungere una specifica posizione del buffer (vai a colonna c ) / : vai a capo È possibile usare parentesi e fattori di ripetizione. Ad esempio (vedere file FORMAT9.F90) in questa maniera stampiamo per 3 volte 3 interi: 100 FORMAT(, 3 ( I1, I2, I 3 ) ) Esercizi: stampa tabella codici ASCII (Soluzione: file ASCII.F90) tavola pitagorica (Soluzione: file TAVOLPI2.F90) Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 27 / 28
Lettura formattata di dati Formattazione dell input e dell output In generale, non c è molta necessità di lettura formattata (la lettura non formattata normalmente va già bene per la maggior parte degli scopi) I concetti sono molto simili a quelli visti per la stampa (WRITE): Buffer di lettura (buffer di input) Non c è il carattere di controllo Descrittori di formato Vedere file FORMAT10.F90 per alcuni casi significativi di lettura di stringhe (descrittore A ) Potenziali errori se i descrittori non sono conformi ai dati da leggere (vedere file FORMAT11.F90) Fortran 90: file e formattazione DIS - Dipartimento di informatica e sistemistica 28 / 28