20: Operazioni sui file e accesso diretto

Nell’articolo precedente abbiamo visto cosa sono i file, le loro caratteristiche e modalità di apertura,  e abbiamo introdotto brevemente con un esempio alcune funzioni utili di lettura e scrittura. Oggi, le vedremo meglio.

Operazioni di gestione di file:

 FILE *fopen(nomefile, modalità) 

apre il file (o lo crea, se non è ancora esistente) e vi associa il flusso; restituisce l’indirizzo della struttura di tipo FILE che descrive il file aperto. Le modalità di apertuta e un esempio di utilizzo di questa funzione lo abbiamo visto la volta precedente.

 int fclose (FILE *fp) 

chiude il file a cui fa riferimento il puntatore fp e determina il rilascio del descrittore di tipo FILE. Se l’operazione di chiusura viene eseguita correttamente, viene restituito il valore 0, altrimenti viene restituito un valore diverso da 0.

int rename (vecchionome, nuovonome) 

consente di modificare il nome di un file da un vecchionome a un nuovonome. Viene resituito 0 se l’operazione è completata correttamente, altrimenti un valore diverso da zero.

Operazioni di gestione degli errori:

 int ferror (FILE *fp) 

controlla nella struttura di descrizione dello stato a cui fa riferimento fp se è stato commesso un errore nella precedente operazione di lettura o scrittura. Se è eseguita correttamente viene restituito zero, altrimenti un valore diverso.

 int feof (FILE *fp) 

controlla nella struttura di descrizione dello stato a cui fa riferimento fp se si è raggiunta la fine del file nell’operazione di lettura o scrittura precedente.

 void clearerr (FILE *fp) 

riporta tutti i campi eof  e error al valore di default.

Operazioni di lettura e scrittura:

int fprintf (FILE *fp, stringa di controllo, elementi);

int fscanf (FILE *fp, stringa di controllo, indirizzo elementi) 

sono le solite funzioni scanf e printf, ma le applicano ai file indicati da fp. Restituiscono il numero degli elementi letti o stampati, oppure -1 in caso di errore.

 int getchar (void); int putchar (int c);

int getc (FILE *fp); int putc (int c, FILE *fp);

int fgetc (FILE *fp); int fputc (int c, FILE *fp); 

getchar legge il prossimo carattere e lo restituisce come intero; putchar scrive come prossimo carattere sul file il parametro passato; le altre 4 funzioni compiono operazioni analoghe. Tutte restituiscono EOF in caso di errore.

 int *fgets (char *s, int n, FILE *fp) 

legge n-1 caratteri di file puntato da fp, oppure fino a che non legge un carattere di newline (ritorno a capo) o se ha raggiunto la fine del file. s punta al primo elemento del vettore in cui vengono messi i dati letti; alla fine del vettore viene inserito il carattere terminatore \0 oppure eventualmente il carattere di newline. Viene restituito il parametro se eseguita correttamente, altrimenti NULL.

 int fputs (char *s, FILE *fp) 

scrive, sul file a cui si riferisce fp, la stringa puntata da s (senza il carattere terminatore \0). Restituisce 0 se l’operazione è eseguita correttamente, altrimenti un valore diverso da 0.

int fread(void *ptr, dimensione elemento, numero elementi, FILE *fp) 

legge un blocco di dati dal file a cui si riferisce fp (dati binari o testuali) e li memorizza nel vettore identificato come ptr. Se la funzione viene eseguita correttamente viene restituito il numero di elementi effetivamente letti.

 int fwrite (void *ptr, dimensione elemento, numero elementi, FILE *fp) 

scrive un blocco di dati (binari o testuali), presi dal vettore ptr, sul file a cui si riferisce fp. La funzione eseguita correttamente restituisce il numero di elementi effettivamente scritti.

Accesso diretto

È utile poter accedere direttamente a un byte particolare del file, pertanto esistono le seguenti funzioni:

 fseek (FILE *fp, long offset, int refpont) 

consente di spostare l’indicatore di posizione all’interno del file per accedere a un byte specifico. offset indica il numero di byte di cui si deve spostare dalla posizione indicata dal refpoint. Il refpoint può assumere tre diversi valori:
SEEK_SET che indica uno spostamento rispetto all’inizio nel file; SEEK_CUR, rispetto alla posizione corrente; SEEK_END rispetto alla fine del file. La funzione restituisce 0 se esguita correttamente, altrimenti un valore diverso.

 ftell(FILE *fp) 

comunica il calore corrente dell’indicatore di posizione del file a cui si riferisce fp.

 rewind (fp) 

sposta l’indicatore di posizione all’inizio del file, ed è analoga a un’operazione del tipo fseek(fp,0, SEEK-SET), ma a differenza della fseek, non restituisce alcun valore.

L’articolo sui file è terminato. Nel prossimo tratteremo di un argomento piuttosto spinoso per i programmatori: le liste. Non perdetelo.

Please follow and like us: