Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica A - GES Prof. Plebani A.A. 2006/2007 Linguaggio C: i file La presente dispensa e da utilizzarsi ai soli fini didattici previa autorizzazione dell autore. E severamente vietata la riproduzione anche parziale e la vendita. 12/12/2006 Corso di Informatica A - GES [E-OZ] - prof. Plebani 1 I file I file sono contenitori di informazioni: sequenze di byte associate ad un nome Ci sono due tipi fondamentali di file: File Binari: sequenza di byte File Testuali: sequenza di caratteri, suddivisi in linee terminate da un carattere di newline; ciascun byte è la codifica ASCII di un carattere alfanumerico (alcuni caratteri possono essere caratteri di controllo non printable) Memorizzati in modo permanente in memoria di massa Necessari come archivio di informazioni persistenti, visto che la memoria di lavoro è invece volatile Corso di Informatica A - GES [E-OZ] - prof. Plebani 2
I file e il sistema operativo Gestiti dal sistema operativo (gestione del file system) Risolve la corrispondenza tra nome del file e tracce/settori del disco in cui è memorizzato Invia i comandi al drive del disco (interfaccia di I/O) per leggere da o scrivere su file (trasferimento tra memoria di massa e memoria centrale) Per organizzare in modo conveniente grandi quantità di file, questi sono raccolti in directory (cartelle) Corso di Informatica A - GES [E-OZ] - prof. Plebani 3 Directory Un direttorio è una raccolta di file È un particolare tipo di file, che contiene informazioni descrittive dell elenco dei file, e di altri direttori, in esso contenuti root FILE1 FILE2 utenti lisa FILE3 dos windows marco FILE6 FILE7 FILE8 FILE9 FILE4 FILE3 FILE5 giochi GIO1 GIO2 Corso di Informatica A - GES [E-OZ] - prof. Plebani 4
Identificazione dei file Possono esistere più file con lo stesso nome, purché abbiano una collocazione diversa nell albero dei direttori Pathname: descrive tutto il percorso nell albero dei direttori per raggiungere il file Il direttorio radice (root) assume il nome dell unità disco, che nei PC basati su Windows è C:\ Es.: il file FILE3 nel direttorio Lisa ha pathname C:\user\lisa\FILE3 I file sono generalmente dotati di attributi Data e ora di creazione o dell ultima modifica Dimensioni espresse in numero di byte Il compito di gestire i file e caricarli nella memoria di lavoro, quando richiesto, è svolto dal sistema operativo Corso di Informatica A - GES [E-OZ] - prof. Plebani 5 File e programmi C In C l accesso ai file da parte di un programma avviene tramite le funzioni disponibili nella libreria stdio.h Le funzioni di libreria della stdio.h interagiscono con il sistema operativo per consentire l accesso a file. Al loro interno le funzioni di libreria contengono delle chiamate a funzioni di sistema operativo Sfruttano la chiamate al sistema operativo (dette primitive) per creare, cancellare, scrivere, leggere da file Corso di Informatica A - GES [E-OZ] - prof. Plebani 6
Uso dei file in ambiente C In ambiente C, per utilizzare un file all interno di un programma è necessario: 1. Aprire un flusso di comunicazione, cioè aprire il file 2. Accedere a file in lettura e/o scrittura 3. Chiudere il flusso di comunicazione, cioè chiudere il file Se un file viene aperto in una certa modalità (binario o testuale), Le operazioni sul file devono essere effettuate in modo congruente, tenendo conto del tipo di file Se creo un file in formato binario devo leggerlo sempre in formato binario Se creo un file in formato testo devo leggerlo sempre in formato testo Corso di Informatica A - GES [E-OZ] - prof. Plebani 7 Apertura di un file 1/2 fopen( nome_file, modalità ) è la funzione per l apertura del file riceve in ingresso il nome del file da aprire e il modo in cui lo si vuole aprire restituisce il puntatore al descrittore del file creato Alla chiamata della funzione il sistema operativo crea un nuovo descrittore di file nella tabella dei file aperti inizializza i campi del descrittore restituisce il puntatore a tale descrittore. Questo puntatore rappresenta il nome logico del file, associato al nome fisico indicato come parametro della fopen Una volta aperto il file, questo può essere acceduto indicando il solo nome logico Corso di Informatica A - GES [E-OZ] - prof. Plebani 8
Apertura di un file 2/2 In un programma C, un file è rappresentato da un puntatore al descrittore del file Un programma C che utilizza un file deve dichiarare una variabile puntatore, ad esempio: FILE *fp; Il programma fa riferimento al file (nel suo complesso) tramite tale variabile (fp) #include <stdio.h> main() { FILE *fp; fp=fopen( ordine.txt, r )... } Corso di Informatica A - GES [E-OZ] - prof. Plebani 9 Descrittori di file in C L insieme dei file aperti da un programma in ambiente C può essere rappresentato da un array (tabella), gestito dal sistema operativo, dove ciascun elemento è di tipo FILE Il tipo FILE è un tipo strutturato, che rappresenta un descrittore di file. I campi più significativi sono: Nome del file Modalità di uso Posizione corrente sul file (prossimo byte a cui accedere) Indicatore di end-of-file (eof) stdio.h contiene, tra le altre, le definizioni di: Identificatore simbolico FILE, usato per indicare il tipo associato al file L identificatore EOF, per indicare la fine del file L identificatore simbolico NULL I prototipi di tutte le funzioni per accesso ai file Corso di Informatica A - GES [E-OZ] - prof. Plebani 10
Flussi di comunicazione standard I file in realtà sono già stati utilizzati prima All inizio dell esecuzione di un programma C vengono automaticamente aperti 3 flussi di comunicazione standard rappresentati da 3 variabili implicite di tipo puntatore a FILE stdin: associato al file che rappresenta il dispositivo di ingresso standard (tastiera) stdout: associato al file che rappresenta il dispositivo di uscita standard (video) stderr: associato al file che rappresenta il dispositivo di uscita standard (video) printf scrive sul file a cui fa riferimento il puntatore stdout scanf legge dal file cui fa riferimento stdin Corso di Informatica A - GES [E-OZ] - prof. Plebani 11 Modalità di apertura di un file r :(sola lettura): sul file sarà possibile eseguire solo operazioni di lettura. Se il file non esiste, la funzione fopen restituisce il codice di errore NULL w (solo scrittura a inizio file ): sul file sarà possibile eseguire solo operazioni di scrittura. Se il file non esiste viene automaticamente creato r+ (lettura e scrittura ): sul file sarà possibile eseguire sia operazioni di lettura che di scrittura. Se il file non esiste, la funzione fopen restituisce il codice di errore NULL w+ (lettura e scrittura ): sul file sarà possibile eseguire sia operazioni di lettura che di scrittura. Se il file non esiste, viene automaticamente creato, in caso contrario il contenuto preesistente del file viene perso (sovrascrittura) a (scrittura fine file ): sul file sarà possibile eseguire solo operazioni di scrittura in coda al file. Se il file non esiste viene automaticamente creato, altrimenti il contenuto preesistente del file non viene perso rb, wb, rb+, wb+, ab+ : stesso significato di cui sopra ma per file binari Corso di Informatica A - GES [E-OZ] - prof. Plebani 12
Chiusura di un file La chiusura di un file è possibile attaverso la funzione fclose int fclose (FILE *fp) Riceve in ingresso il puntatore del file da chiudere Restituisce 0 se l operazione è andata a buon fine, EOF se non è andata a buon fine Alla chiamata, il sistema operativo chiude il file referenziato dal puntatore passato come parametro, assegna al puntatore il valore NULL e libera l elemento che conteneva il descrittore del file chiuso Corso di Informatica A - GES [E-OZ] - prof. Plebani 13 Gestione degli errori int feof(file *p) Restituisce un valore!=0 se durante la lettura si incontra EOF, 0 se non si è incontrata la fine del file Accedere ad un file in una zona oltre la fine del file è considerato errore int ferror(file *p) restituisce un valore!=0 se durante la lettura non si è verificato errore, 0 se si è verificato errore Corso di Informatica A - GES [E-OZ] - prof. Plebani 14
Lettura e scrittura di file La lettura e la scrittura da file dipende dal tipo di file Se il file è testuale i caratteri letti/scritti possono essere soggetti ad interpretazione Per esempio il carattere ascii 10 indica il comando di a capo Questo carattere non viene letto o scritto ma viene attivato il comando che manda a capo la prossima riga Se il file è binario i caratteri letti/scritti non sono interpretati Quindi se scrivo il carattere con codice ascii 10 in un file binario viene scritto proprio il carattere con codice 10 Corso di Informatica A - GES [E-OZ] - prof. Plebani 15 Formato dei file La lettura e la scrittura devono essere operazioni simmetriche La struttura delle informazioni inserite in un file sono definite da chi crea il file Questa struttura indica il formato del file La lettura deve rispettare questa struttura Corso di Informatica A - GES [E-OZ] - prof. Plebani 16
Accesso Sequenziale Le operazioni di lettura e scrittura accedono al file in modo sequenziale, e mantengono traccia del punto in cui si è arrivati nella scrittura del file Dopo l apertura, il puntatore è posizionato all inizio del file, dopo si sposta di un numero di byte pari a quelli che sono stati letti (scritti) e trasferiti in (da) memoria centrale Se l apertura di un file è in scrittura, in modalità a (append), allora dopo l apertura il puntatore è posizionato a fine file La funzione feof(fp), indica se il file pointer è posizionato a fine file feof(fp)!= 0 se il file pointer è posizionato a fine file feof(fp) == 0 negli altri casi Corso di Informatica A - GES [E-OZ] - prof. Plebani 17 Lettura e scrittura di file testuali 1/2 In un file testuale possono leggere e scrivere Un carattere per volta (fgetc, fputc) Un blocco formattato (fscanf, fprintf) int fgetc (FILE *fp) legge il prossimo carattere dal file specificato come parametro int fputc (int c, FILE *fp) scrive sul file specificato come parametro il carattere specificato come parametro Esistono anche le funzioni getc e putc Hanno lo stesso prototipo e sono equivalenti Hanno una diversa implementazione Tutte queste funzioni restituiscono EOF in caso di errore Corso di Informatica A - GES [E-OZ] - prof. Plebani 18
Lettura e scrittura di file testuali 2/2 int fscanf(file *fp, stringa_controllo, variabili) Ha la stesso effetto della scanf ma legge da file La scanf è la fscanf in un cui fp punta a stdin int fprintf(file *fp, stringa_controllo, variabili) Ha la stesso effetto della scanf ma scrive da file La printf è la fprintf in un cui fp punta a stdout Tutte queste funzioni restituiscono EOF in caso di errore Corso di Informatica A - GES [E-OZ] - prof. Plebani 19 Lettura e scrittura di blocchi di byte int fread (void *punt, dim_blocco, num_blocchi, FILE *fp) Legge dal file fp un numero di byte pari a dim_blocco*num_blocchi e li memorizza nell area di memoria puntata da punt Restituisce il numero di byte letti int fwrite (void *punt, dim_blocco, num_blocchi, FILE *fp) Scrive sul file fp un numero di byte pari a dim_blocco*num_blocchi letti dall area di memoria puntata da punt Restituisce il numero di byte scritti Corso di Informatica A - GES [E-OZ] - prof. Plebani 20
Accesso diretto ad un byte specifico long int ftell(file *fp) Restituisce il valore dell indicatore di posizione del prossimo byte a cui si può accedere int fseek (FILE *fp, long offset,int refpoint) Sposta l indicatore di posizione del prossimo byte a cui accedere del valore di offset (positivo o negativo) a partire da refpoint Restituisce 0 se l operazione è possibile rewind(file *fp) sposta l indicatore di posizione all inizio del file Corso di Informatica A - GES [E-OZ] - prof. Plebani 21