nikpez di nikpez
Ominide 738 punti

Gestione dei file in C

Possiamo immaginare che al momento dell’apertura del file venga predisposto un cursore che segna il punto di accesso all’interno del file (un dato del file viene letto, o un dato viene scritto nel file, in corrispondenza della posizione di tale cursore).
Quando un file viene aperto in lettura, il cursore si posiziona all’inizio del file; quando un dato viene letto il cursore passa automaticamente alla posizione successiva: la prossima lettura legge il dato successivo … .
Idem per la scrittura.

Apertura di un file
FILE * fopen(const char * name, const char * mode);
dove:
name: è una stringa che rappresenta il nome (assoluto o relativo) del file
nel File System.
mode: esprime la modalità di accesso scelta
“r”, in lettura (read)
“w”, in scrittura (write)
“a”, scrittura, aggiunta in fondo (append)

“b”, a fianco ad una delle precedenti, indica che il file è binario
“t”, a fianco di una delle precedenti, indica che il file è di testo
Se eseguita con successo, l’operazione di apertura ritorna come risultato un puntatore a FILE (associato al file aperto).
Se, invece, l’apertura fallisce (ad esempio perché il file non esiste), fopen() restituisce il valore NULL.

Apertura in lettura
fp = fopen(“studenti.dat”,”rb”);
Apertura in scrittura
fp = fopen(“studenti.dat”,”wb”);
Apertura in aggiunta (append)
fp = fopen(“studenti.dat”,”ab”);

Chiusura di un file
Al termine di una sessione di accesso al file, esso deve essere chiuso.
L’operazione di chiusura si realizza con la funzione fclose():
int fclose(FILE *stream); //dove stream è il file da chiudere fclose() ritorna come risultato un intero:
0, se l’operazione di chiusura è eseguita correttamente
la costante predefinita EOF, se la chiusura non è andata a buon fine. Il suo valore è -1.
Prima della chiusura, tutti i buffer vengono svutotati (I/O bufferizzato).

Funzione feof()
Durante la fase di accesso ad un file è possibile verificare la presenza della marca di fine file con la funzione di libreria:
int feof(FILE *stream);
feof() controlla se è stata raggiunta la fine del file stream nella operazione di lettura precedente. Restituisce il valore 0 (falso logico) se non è stata raggiunta la fine del file, altrimenti un valore diverso da zero (vero logico).

Lettura di un file binario

(I/O bufferizzato)
Una volta aperto il file, su di esso si può accedere in lettura e/o scrittura, compatibilmente con quanto specificato in fase di
apertura.
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
dove:
ptr, indirizzo di memoria della variabile in cui depositare i dati letti dal file
(solitamente un record logico)
size, dimensione in byte di ogni entità (record logico)
n, numero di entità (record logici) che si vogliono leggere (di solito 1)
stream, file da cui leggere
La funzione restituisce il numero di entità (record logici) effettivamente lette, che possono essere meno di quelle richieste se il file termina prima.
Restituisce 0 se incontra la fine del file o se è in errore.

Scrittura di un file binario
(I/O bufferizzato)
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);
dove:
ptr, indirizzo di memoria della variabile che contiene i dati che dovranno
essere scritti sul file (solitamente un record logico)
size, dimensione in byte di ogni entità (record logico)
n, numero di entità (record logici) che si vogliono scrivere (di solito 1)
stream, file su cui scrivere
La funzione restituisce il numero di entità (record logici) effettivamente scritte. Restituisce 0 se è in errore.

Registrati via email