Concetti Chiave

  • Il cursore di un file indica la posizione attuale per lettura o scrittura, spostandosi automaticamente dopo ogni operazione.
  • I file possono essere aperti in diverse modalità: lettura ("r"), scrittura ("w"), aggiunta ("a"), binario ("b") e testo ("t").
  • La funzione `fopen()` restituisce un puntatore a FILE se l'apertura ha successo; altrimenti, restituisce NULL.
  • La chiusura di un file si esegue con `fclose()`, che restituisce 0 se riuscita o EOF (-1) in caso di errore.
  • Le funzioni `fread()` e `fwrite()` sono utilizzate per leggere e scrivere file binari, restituendo il numero di entità lette o scritte.

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.

Modalità di apertura dei file

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 e verifica del file

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 e scrittura di file binari

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.

Domande da interrogazione

  1. Qual è la funzione utilizzata per aprire un file in C?
  2. La funzione utilizzata per aprire un file in C è `fopen()`, che richiede il nome del file e la modalità di accesso come parametri.

  3. Cosa indica il valore restituito da `fopen()` in caso di errore?
  4. Se l'apertura del file fallisce, `fopen()` restituisce il valore NULL, indicando che il file non esiste o non può essere aperto.

  5. Qual è la funzione per chiudere un file e cosa restituisce?
  6. La funzione per chiudere un file è `fclose()`, che restituisce 0 se l'operazione di chiusura è eseguita correttamente, altrimenti restituisce EOF (-1) in caso di errore.

  7. Come si verifica se si è raggiunta la fine di un file durante la lettura?
  8. Si può verificare la presenza della fine del file utilizzando la funzione `feof()`, che restituisce 0 se non è stata raggiunta la fine del file, altrimenti un valore diverso da zero.

  9. Quali sono le funzioni utilizzate per la lettura e scrittura di file binari?
  10. Per la lettura di file binari si utilizza `fread()`, mentre per la scrittura si utilizza `fwrite()`, entrambe con parametri che specificano l'indirizzo di memoria, la dimensione e il numero di entità da leggere o scrivere.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community