Introduzione al Linguaggio C File I/O Daniele Pighin April 2009 Daniele Pighin Introduzione al Linguaggio C 1/15
Outline File e dati Accesso ai file File I/O Daniele Pighin Introduzione al Linguaggio C 2/15
Outline File e dati Accesso ai file File I/O Daniele Pighin Introduzione al Linguaggio C 3/15
Cosa é un file Un file é un astrazione logica fornita dal sistema operativo che consente di memorizzare in modo permanente una sequenza ordinata di byte La semantica di un file dipende da come se ne interpreta un contenuto La semantica delle operazioni di scrittura sul file deve essere rispettata dalle operazioni di lettura - Esempio: se quando scriviamo un file ci mettiamo una lista di numeri telefonici, quando lo leggiamo non possiamo interpretare quei valori come se fossero date Due principali tipologie di file: - File di testo: contengono solo caratteri ASCII (o Unicode) - File binari: contengono anche (principalmente) caratteri non stampabili Daniele Pighin Introduzione al Linguaggio C 4/15
Utilitá dei file Alcuni usi dei file: Per salvare impostazioni e configurazioni (es: sfondo del desktop) Per immettere un gran numero di parametri in un problema di calcolo Per memorizzare permanentemente il risultato di un elaborazione (es: un programma che calcola tutti i numeri primi compresi in un intervallo) e consentire agli utenti di esaminarlo Per caricare una collezione di dati su cui eseguire un elaborazione (es: calcolare la deviazione standard di una distribuzione di milioni di valori) Per interagire con altri programmi (l output di un programma puó essere l input di un altro) Per consentire agli utenti di scambiarsi informazioni (es: un documento Word o un file di dati) Daniele Pighin Introduzione al Linguaggio C 5/15
Outline File e dati Accesso ai file File I/O Daniele Pighin Introduzione al Linguaggio C 6/15
Utilizzo di file in C L utilizzo di un file passa attraverso 3 fasi principali: Apertura: Si comunica al sistema operativo su quale file si vuole agire e si specifica se si intende leggere e/o scrivere dal file. Il sistema operativo verifica che la nostra richiesta sia valida e prepara le risorse necessarie Lettura/Scrittura: Si leggono/scrivono dati dal/sul file Chiusura: Si comunica al sistema operativo che non abbiamo piú bisogno di leggere/scrivere dal file. Il sistema operativo rilascia le risorse precedentemente allocate Le funzioni e i tipi di dato necessari a manipolare file in C sono dichiarati in stdio.h Daniele Pighin Introduzione al Linguaggio C 7/15
Apertura di un file Per aprire un file si invoca la funzione FILE* fopen(const char* path, const char* mode) I due parametri sono stringhe: path é il path, assoluto oppure relativo alla directory da cui eseguiamo il programma, che identifica il file che vogliamo aprire mode indica che tipo di accesso ci interessa La funzione restituisce un puntatore di tipo FILE*, che rappresenta le risorse allocate dal sistema operativo per gestire il file che abbiamo aperto Se l apertura fallisce, la funzione ritorna NULL Tra le altre cose, un oggetto FILE contiene un cursore che tiene traccia dell attuale posizione all interno del file. Ogni operazione di lettura/scrittura avanza la posizione del cursore Daniele Pighin Introduzione al Linguaggio C 8/15
Modalitá di apertura di un file Il parametro mode puó assumere i seguenti valori: r Apre il file in sola lettura (non sará possibile scrivere sul file) w Apre il file in sola scrittura (non sará possibile leggere dal file). Se il file giá esiste, viene troncato a lunghezza 0, altrimenti viene creato un nuovo file a Apre in modalitá append, cioé in sola scrittura ma senza troncamento (le cose che scriviamo vengono aggiunte alla fine del file) r+ Apre un file giá esistente in lettura/scrittura. Non c é troncamento. Il cursore viene posizionato all inizio del file w+ Come "w", ma é anche possibile leggere dal file a+ Come "a", ma anche possibile leggere dal file. Tutte le operazioni di scrittura avvengono alla fine del file Daniele Pighin Introduzione al Linguaggio C 9/15
Chiusura di un file La funzione int fclose(file* f) é usata per chiudere il file descritto dal puntatore f La funzione ritorna: 0 Se il file é stato chiuso correttamente EOF End Of File, una costante intera definita in stdio.h, se c é stato qualche errore Quando viene eseguita l istruzione return della funzione main, tutti i file aperti vengono automaticamente chiusi In caso di errore, un programma potrebbe uscire in modo inatteso, ed in questo caso alcune delle operazioni di scrittura su file richieste potrebbero non essere eseguite a causa della bufferizzazione é importante chiudere sempre i file aperti in scrittura quando non si usano piú! Daniele Pighin Introduzione al Linguaggio C 10/15
Esempio 1 #i n c l u d e <s t d i o. h> 2 i n t main ( i n t argc, char a r g v [ ] ) { 3 i f ( a r g c!= 2) { 4 p r i n t f ( I s t r u z i o n i : %s <nome f i l e d i i n p u t >\n, a r g v [ 0 ] ) ; 5 r e t u r n 1 ; 6 } 7 char f i l e n a m e = a r g v [ 1 ] ; 8 FILE m y f i l e = f o p e n ( f i l e n a m e, r ) ; / APERTURA / 9 i f ( m y f i l e == NULL) { 10 p r i n t f ( I m p o s s i b i l e a p r i r e i l f i l e %s \n, f i l e n a m e ) ; 11 r e t u r n 1 ; 12 } 13 / LETTURA/SCRITTURA / 14... // i l f i l 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, f a c c i q u a l c o s a 15 i f ( f c l o s e ( m y f i l e )!= 0) { / CHIUSURA / 16 p r i n t f ( E r r o r e d u r a n t e l a c h i u s a r a d e l f i l e \n ) ; 17 r e t u r n 1 ; 18 } 19 r e t u r n 0 ; 20 } Daniele Pighin Introduzione al Linguaggio C 11/15
Outline File e dati Accesso ai file File I/O Daniele Pighin Introduzione al Linguaggio C 12/15
Standard streams e file Quando includiamo stdio.h in un programma, automaticamente abbiamo disponibili tre simboli di tipo FILE*: stdin L input stream del programma, aperto in sola lettura stdout L output stream del programma, aperto in sola scrittura stderrr L error stream del programma, aperto in sola scrittra Unix utilizza l astrazione del file per rappresentare tutto ció su/da cui si possano scrivere/leggere dati In un programma lanciato all interno di un terminale a riga di comando, lo standard input é un file fittizio che contiene tutti i caratteri immessi attraverso la tastiera, mentre lo standard output e lo standard error sono la sequenza di caratteri visualizzati nel terminale Invocare printf equivale a scrivere sul file rappresentato da stdout Invocare scanf equivale a leggere dal file rappresentato da stdin Daniele Pighin Introduzione al Linguaggio C 13/15
Lettura e scrittura da file Per leggere/scrivere un file é possibile usare le funzioni - int fprintf(file* file, const char* template,...); - int fscanf(file* file, const char* template,...); printf e scanf sono due versioni semplificate di queste funzioni in cui il primo argomento é fissato e vale, rispettivamente, stdout e stdin Le due funzioni sono equivalenti a printf e scanf, ma prendono un argomento aggiuntivo (il primo) che é il file su/da cui scrivere/leggere Daniele Pighin Introduzione al Linguaggio C 14/15
Esercizio Scrivere un programma che accetta due argomenti da riga di comando corrispondendi a due nomi di file. Il primo file viene aperto in sola lettura, e si assume essere composto di tre righe: La prima riga contiene un numero intero n 256, che indica una dimensionalitá La seconda e la terza riga contengono ciascuna n valori double, e definiscono le coordinate di due vettori n-dimensionali Il secondo file viene aperto in scrittura. In questo file, il programma scrive, su righe diverse: La norma del primo vettore La norma del secondo vettore Il prodotto scalare tra i due vettori Il prodotto scalare tra i due vettori normalizzati Daniele Pighin Introduzione al Linguaggio C 15/15