Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
FILE
programma con i file gestiti dal sistema operativo
Esempio di dichiarazione di variabile di tipo FILE:
FILE *fp;
L’accesso a file: il tipo FILE
Il programma opera su un file tramite una struttura e le funzioni messe a disposizione
• FILE
dalla libreria standard
Tali funzioni usano variabili di tipo per identificare il file sul quale operare
• FILE
Un programma può aprire e usare più file contemporaneamente
•
Apertura e chiusura di file
Per poter utilizzare un file, questo deve venire aperto
• Aprire un file significa comunicare al sistema operativo che si intende accedere al contenuto
• del file
Si utilizza la funzione (File OPEN)
• fopen
Il file deve poi essere chiuso utilizzando la funzione (File CLOSE)
• fclose
Le funzioni di apertura e chiusura di file operano su variabili di tipo puntatore a
• FILE
La non fa altro che inizializzare la variabile di tipo associata al file aperto e
• fopen FILE
restituirne il puntatore
Esempio
Dichiaro la variabile che punta a una struttura necessaria per gestire lo stream
• fp
FILE *fp;
Associo lo stream al file di nome
• fp "pluto.txt"
fp=fopen("pluto.txt", "r");
Leggo una riga dallo stream
• fp
fgets(buf, BUFDIM, fp);
Chiudo lo stream
• fclose(fp);
Apertura e chiusura di file
Prototipo:
FILE *fopen(char *path, char *mode);
Accetta due parametri di tipo stringa (puntatore a carattere):
punta al nome del file da aprire (incluso il percorso)
• path specifica il modo con il quale aprire il file ecc.)
• mode (“w”, “r”,
Un file può essere aperto per diversi scopi: lettura, scrittura e append (scrittura alla fine del file)
La stringa mode può quindi valere:
(lettura): l'accesso al file avviene dal suo inizio
• "r" (lettura e scrittura): l'accesso al file avviene dal suo inizio. Il file deve esistere, altrimenti
• "r+"
dà errore.
(scrittura): se il file esiste, esso viene sovrascritto, altrimenti un nuovo file viene creato;
• "w"
l'accesso al file
avviene dal suo inizio
• (lettura e scrittura): se il file esiste, esso viene sovrascritto, altrimenti un nuovo file
• "w+"
vuoto viene creato; l'accesso al file avviene dal suo inizio;
(append): la scrittura avviene a partire dalla fine del file; se il file non esiste, esso viene
• "a"
creato;
(lettura e append): se il file non esiste, un nuovo file viene creato; l'accesso in lettura
• "a+"
avviene dall'inizio del file, mentre la scrittura è sempre effettuata alla fine del file
Modalità in aggiornamento
L’apertura di un file in modalità di aggiornamento permette la lettura e la scrittura dello stesso file
mediante lo stesso stream (fp)
La differenza tra e è solo nell’apertura:
"r+" "w+"
à se il file non esiste dà errore
• "r+" à se il file esiste già, lo ricrea vuoto
• "w+"
Apertura e chiusura di file
Per completezza, è anche possibile aggiungere il carattere alla fine o in mezzo a qualsiasi
• "b"
precedente di caratteri (es., ottenendo o
“wb” “ab+”)
Questo carattere indica esplicitamente che il file da aprire è binario
• Molti sistemi, infatti, trattano i file binari e i file di testo allo stesso modo; quindi, il fatto di
• specificare la risulta superfluo, ma altri sistemi operativi potrebbero operare delle
b
distinzioni, e quindi potrebbe essere necessario specificare esplicitamente il tipo di file
trattato
La funzione restituisce un puntatore di tipo correttamente inizializzato se
• fopen FILE
l'operazione ha avuto successo
Altrimenti ritorna
• NULL
Tipiche fonti di errore (che restituiscono
• NULL):
- Il tentativo di aprire in lettura un file che non esiste
- Aprire in scrittura un file read-only (es. i file su un CD-ROM)
- Aprire un file per il quale non si dispongono i necessari permessi di accesso
Il file deve essere chiuso utilizzando la funzione
• fclose
La chiusura del file serve per liberare (ovvero fare il flush) delle aree di memoria allocate dalle
• funzioni della libreria per memorizzare le informazioni lette e scritte sul file dichiarazione:
int fclose(FILE *fp);
Accetta come parametro il puntatore a che identifica il file da chiudere
• FILE
Ritorna 0 se la chiusura avviene con successo
• Ritorna (End Of File) in caso di errore
• EOF
Considerazione sull’efficienza
Tutte le operazioni di I/O relative ai file sono intrinsecamente e notevolmente più lente di
• quelle che usano solo la memoria, nonostante la presenza di buffer e cache
Conviene ridurre il più possibile l’accesso al file
• Quando è necessario utilizzare molte volte i dati contenuti in un file, conviene in genere
caricarne il contenuto in memoria in opportune strutture dati
Apertura e chiusura di file: esempio
FILE *fin, *fout;
if (!(fin = fopen("matrice.dat", "r"))) {
perror("matrice.dat");
exit(1);
}
if (!(fout = fopen("documenti/info.txt", "w"))) {
perror("documenti/info.txt");
exit(1); }
/* ... istruzioni di accesso al file ... */
fclose(fin);
fclose(fout);
I file di I/O standard
Nel file sono definite tre variabili di tipo
• stdio.h FILE *:
- -> standard input (tipicamente la tastiera)
stdin
- -> standard output (tipicamente il video)
stdout
- -> standard error (tipicamente il video)
stderr
sono gli stream standard
Vengono aperti automaticamente dal programma quando questo viene eseguito
•
La posizione all’interno del file
Ogni operazione di lettura o scrittura che interessa il file modifica la posizione corrente all'interno del
file Ad ogni lettura o scrittura la posizione corrente viene spostata in avanti e posta in
• corrispondenza al successivo byte da leggere o scrivere (accesso sequenziale)
Per esempio, quando viene letta una riga di testo fino al newline, la posizione nel file viene
• spostata al primo byte della riga successiva
Lettura/scrittura di singoli caratteri
Il file viene letto o scritto carattere per carattere
• I caratteri letti possono essere aggregati in strutture più articolate, come vettori e stringhe,
• oppure elaborati singolarmente
Le funzioni messe a disposizione dalla libreria standard per questo tipo di interazione
• (lettura/scrittura per carattere) con i file sono e
getc putc
La funzione getc e putc
prototipo:
int getc(FILE *stream);
int putc(int c, FILE *stream);
• getc legge un singolo carattere dal file stream
• putc scrive il carattere c sul file stream
• esempio: copy_char.c
Accesso a file di testo
Il C mette a disposizione varie funzioni per la lettura di dati da file di testo e l'interpretazione
• (parsing) del loro contenuto
La lettura e l'interpretazione dei dati avvengono in due fasi successive, per mezzo di funzioni
• diverse
La funzione di lettura consigliata è
• fgets
- Ad ogni chiamata, la funzione carica una linea di testo del file in una stringa
la stringa viene deve essere interpretata utilizzando funzioni come
• sscanf
Lettura per righe con e interpretazione con
fgets sscanf
Spesso un file è formato da righe di testo che hanno una struttura nota
• Per struttura di una riga si intende il formato del suo contenuto, ovvero i campi che la
• compongono
Esempio: ogni riga di un file potrebbe essere composta da numeri interi separati da virgola
• In questo caso è possibile utilizzare lo schema di lettura basato su e di parsing basato
• fgets
su sscanf
è dichiarata come segue:
• fgets
char *fgets(char *s, int size, FILE
*stream);
- è il puntatore alla stringa letta;
s
- è il numero massimo di caratteri da restituire;
size
- è il file dal quale leggere la stringa
stream
- il valore di ritorno è il puntatore alla stringa stessa
è dichiarata come segue:
• sscanf int sscanf(const char *str, const char *format, ...);
- Il parsing effettuato da è identico a quello della
sscanf scanf
- Invece di fare il parsing da viene analizzata la stringa (primo parametro della
stdin str
funzione)
while(fgets(buf, sizeof(buf), fin)!=NULL){
sscanf(buf, ....);
}
Accesso a file di testo
Un altro approccio per la lettura usa
• fscanf
- presenta una serie di controindicazioni
Uno dei problemi è che non è possibile separare la lettura della stringa dall'interpretazione del
• contenuto
Attenzione:
Una volta aperto un file in lettura, non mescolare l'uso di e per la lettura di dati dallo
fgets fscanf
stesso file
Lettura mediante fscanf
Con file di testo da leggere di struttura nota è possibile usare la funzione fscanf
Si comporta come la già illustrata per la lettura da standard
• scanf
input
È possibile specificare da quale file leggere (primo parametro della funzione)
• Si può indicare anche il file standard in questo caso il comportamento è identico a
• stdin;
quello di scanf
Lettura e scrittura mediante fscanf e fprintf
Definizione di
• fscanf:
int fscanf(FILE *stream, const char *format, ...);
Definizione di
• fprintf:
int fprintf(FILE *stream, const char *format, ...);
Scrittura mediante fprintf
Le due funzioni seguenti sono del tutto equivalenti:
printf("%s %d\n", nome, anni);
fprintf(stdout, "%s %d\n", nome, anni);
Effettuano entrambe la scrittura sullo standard output di una stringa, seguita da un valore numerico
intero decimale
Uso di feof
Spesso si usa (File EOF) per verificare la terminazione del file in abbinamento a
• feof fscanf
ritorna un valore diverso da zero se è stata tentata una lettura oltre la fine del file di input
• feof
da parte di fscanf
Purtroppo, capita sovente che la venga utilizzata in modo errato
• feof
Modalità di funzionamento di feof
La non controlla esplicitamente il raggiungimento della fine del file
• feof
Restituisce il valore vero se si è già tentata una lettura oltre la fine del file
• Non è possibile sapere se si è letto l'ultimo valore in un file fintanto che non si tenta di
• effettuare una operazione di lettura oltre la fine del file stesso (con qualunq