File Binari e Posizionamento
A differenza dei file di testo (in cui 123 è salvato come tre caratteri '1', '2', '3'), i file binari contengono i dati nello stesso formato numerico e grezzo in cui risiedono nella RAM del computer.
Lavorare con i binari è estremamente efficiente perché evita qualsiasi operazione di conversione e “parsing”.
Scrivere blocchi di memoria: fwrite
Section titled “Scrivere blocchi di memoria: fwrite”Immagina di avere una struct Giocatore e volerla salvare su disco. Invece di trasformarla in testo riga per riga, la “travasiamo” nel file.
typedef struct { int punti; char nome[10];} Giocatore;
// Apriamo con "wb" (write binary)FILE *fp = fopen("salvataggio.bin", "wb");Giocatore g = { 1500, "Luigi" };
// Scrive 1 blocco della dimensione della struct 'Giocatore' nel filefwrite(&g, sizeof(Giocatore), 1, fp);Leggere blocchi di memoria: fread
Section titled “Leggere blocchi di memoria: fread”Per ricaricare il file, basta eseguire l’operazione contraria leggendolo con modalità "rb":
Giocatore caricato;// Legge 1 blocco di memoria dal file e lo infila dentro la variabile 'caricato'fread(&caricato, sizeof(Giocatore), 1, fp);Muoversi all’interno del file: fseek e ftell
Section titled “Muoversi all’interno del file: fseek e ftell”I file (sia di testo che binari) possiedono un indicatore di posizione (una sorta di testina di lettura). Quando apri un file, la “testina” si trova all’inizio (o alla fine se aperto in modalità Append). Mentre leggi o scrivi, la testina avanza automaticamente.
Puoi muovere liberamente la testina per effettuare un Accesso Casuale (Random Access) usando fseek.
Esempi in C:
// Salta 100 byte in avanti partendo dall'inizio (SEEK_SET)fseek(fp, 100, SEEK_SET);
// Torna indietro di 20 byte rispetto alla posizione attuale (SEEK_CUR)fseek(fp, -20, SEEK_CUR);
// Vai alla fine del file (SEEK_END)fseek(fp, 0, SEEK_END);Per scoprire in che punto esatto si trova la “testina” al momento, si usa ftell(fp).
💻 Esercizio Pratico
Section titled “💻 Esercizio Pratico”Spostare il cursore per estrarre la parte che ci interessa in un file è essenziale. Data una funzione che ha a disposizione un file binario fp, usa fseek per saltare i primi 10 byte (partendo dall’inizio), e poi esegui un fread per prelevare il numero intero (4 byte) lì presente.