DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
File
Marco D. Santambrogio – [email protected]
Ver. aggiornata al 21 Maggio 2014
Obiettivi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Il salvataggio dei dati
 File
• File e OS
• File in C
2
I programmi che abbiamo considerato
finora….
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Perdono dati di ingresso, risultati
intermedi e risultati finali al
termine dell’esecuzione
 Volatilità delle variabili
 Soluzione: file
3
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
4
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 driver 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)
5
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
6
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
7
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
8
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
9
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)
#include <stdio.h>
main()
{
FILE *fp;
fp=fopen(“ordine.txt”, “r”)
………
}
10
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
11
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
• Alla chiamata,



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
12
Un primo esempio
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
13
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
14
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
15
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
16
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
17
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
18
Creiamo e scriviamo su un file
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
19
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
20
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
21
Scriviamo con fpritnf e manipoliamo un
file
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
22
Flussi di comunicazione standard
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• I file in realtà sono già stati utilizzati dalla prima lezioe
• 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
23
Stampiamo a video…
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
24
Legge e mostra a video un file di testo
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
La funzione putchar() scrive il
carattere c su stdout.
25
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 */
Clients.dat
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 );
}
}
26
Fonti per lo studio + Credits
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Fonti per lo studio
 http://digilander.libero.it/uzappi/C/
• Credits
 Gianluca Palermo
Scarica

PPT - V1 - Dipartimento di Elettronica ed informazione