DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
File
Marco D. Santambrogio – [email protected]
Ver. aggiornata al 9 Maggio 2012
Obiettivi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Alcun problemi aperti
• File
 File e OS
 File in C
2
I programmi che abbiamo considerato
finora….
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Richiedono di conoscere a priori le
dimensioni dei dati da elaborare (es. per
un array bisogna sempre specificare la
dimensione a tempo di compilazione)
 Strutture dati statiche
 Soluzione: strutture dati dinamiche
• Perdono dati di ingresso, risultati
intermedi e risultati finali al termine
dell’esecuzione
 Volatilità delle variabili
 Soluzione: file
3
Strutture dati dinamiche
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Servono per i casi in cui non è
possibile stimare a priori la
dimensione massima di una struttura
dati
• E’ possibile allocare la memoria a
tempo di esecuzione; il numero
massimo di elementi può addirittura
variare durante l’esecuzione
• In C vengono realizzate attraverso
l’uso dei puntatori...non
approfondiremo oltre
4
Non si deve fare!!
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
int funzione(int vet[], int n){
Int vettoreAusiliario[n];
/*Errore in compilazione
n non e’ noto a compile time! */
}
5
I file
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• 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
6
I file e il sistema operativo
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• 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)
7
Identificazione dei file
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• 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 è 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
8
File e programmi C
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• 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
9
Uso dei file in ambiente C
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• In ambiente C, per utilizzare un file
all’interno di un programma è necessario:
• Aprire un “flusso di comunicazione”, cioè aprire il
file
• Accedere a file in lettura e/o scrittura
• 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
10
Apertura di un file 1/2
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• File * 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
11
Apertura di un file 2/2
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• 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)
12
Flussi di comunicazione standard
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• 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
13
Modalità di apertura di un file
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
“r”


•
“w”


•
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”


•
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+”


•
sul file sarà possibile eseguire solo operazioni di scrittura ad inizio file
Se il file non esiste viene automaticamente creato
“r+”


•
sul file sarà possibile eseguire solo operazioni di lettura.
Se il file non esiste, la funzione fopen restituisce il codice di errore NULL
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
14
Chiusura di un file
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• 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
!=0 se non è andata a buon fine



il sistema operativo chiude il file referenziato dal puntatore
assegna al puntatore il valore NULL
libera l’elemento che conteneva il descrittore del file chiuso
• Alla chiamata,
15
Gestione degli errori
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• int feof(FILE *p)
 Restituisce
• !=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
• !=0 se durante la lettura non si è verificato
errore
• 0 se si è verificato errore
16
Formato dei file e Lettura/scrittura
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• La lettura e la scrittura
 devono essere operazioni simmetriche
 dipendono dal tipo di file
• La struttura delle informazioni inserite in
un file sono definite da chi crea il 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
17
Accesso Sequenziale
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• 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
18
Lettura e scrittura di file testuali
1/2
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• 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 implementazioni
19
Lettura e scrittura di file testuali
2/2
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• 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 printf ma scrive sul
file
 La printf è la fprintf in un cui fp punta a
stdout
• Tutte queste funzioni restituiscono EOF in
caso di errore
20
Lettura e scrittura di blocchi di byte
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
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
21
Accesso diretto ad un byte specifico
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• 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
22
Legge e mostra a video un file di testo
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
#include <stdio.h>
#include <stddef.h>
int main() {
FILE *fp;
char c;
fp = fopen("filechar", "r"); /* file lettura, modalità testo */
if ( fp != NULL ) {
c = fgetc(fp);
while (c != EOF) {
putchar(c);
c = fgetc(fp);
}
fclose(fp);
}
else
printf("Il file non può essere aperto\n");
return 0;
}
23
Lettura sequenziale di un file
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
#include <stdio.h>
main(){
int account;
char name[ 30 ];
double balance;
FILE *cfPtr; /* cfPtr = clients.dat file pointer */
cfPtr = fopen( "clients.dat", "r" );
if ( cfPtr == NULL )
printf( "File could not be opened\n" );
else {
printf( "%-15s %-15s %s\n", "Account", "Name", "Balance" );
fscanf( cfPtr, "%d%s%lf", &account, name, &balance );
while ( !feof( cfPtr ) ) {
printf( "%-15d%-15s%7.2f\n", account, name, balance );
fscanf( cfPtr, "%d%s%lf", &account, name, &balance );
}
fclose( cfPtr );
}
}
Clients.dat
24
Fonti per lo studio + Credits
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Fonti per lo studio
• Credits
 Gianluca Palermo
Scarica

PPT - Dipartimento di Elettronica ed informazione