Corso Avanzato C++ – File binari

Il problema

Nell’articolo sui file di testo e il loro uso in C++

sono sono stati esaminati l’uso di singole variabili che sono poi trasferite dalla memoria RAM al file e viceversa.
Questa organizzazione molto semplice ha il difetto di non essere ottimale per gestire grosse quantità di informazioni strutturate. Nella programmazione in C++ è possibile utilizzare la struttura dati struct che altro non è che un modello di record logico, che poi pul essere trasferito oscurando parzialmente il contenuto in un flle binario ovvero una sequenza di byte.
Per svolgere questa operazione nel metodo open della classe fstream è opportuno indicare il flag bin ios::binary per indicare che il file che si apre in lettura / scrittura / aggiunta è un file binario.
Questo però cambia la modalità di lettura e scrittura poiché ogni record deve essere ricopiato con le specifiche di formato della struct come sequenza di byte sul file quando è svolta una scrittura / aggiunta, in memoria RAM nel procedimento inverso.
Immaginiamo di definire una struct e di associare una variabile di tipo struct nel nostro programma, allora nell’operazione di scrittura posto f il nome del file logico, dopo averlo aperto un operazione di scrittura avviene con il metodo write con la sintassi:

f.write((char*)&(struct nome struttura), sizeof(struct nome struttura));

ad esempio il codice C++:


struct dip
{ char nome[21];
  char cognome[21];
 int age;
 float stipendio;
{;
...
int main()
{ struct dip d;
  fstream f;
  f.open("file.dat",ios::out | ios::binary);
if (!f)
{ cout << "\nErrore grave non riesco ad aprire il file !\n";
  return 0;
}
// lettura dati da tastiera //
f.write((char*)&d,sizeof(struct dip));
...

  

Questo frammento di codice incompleto mostra come è scritta una struct, il metodo write ha due argomenti il primo è l’area di memoria associata alla struct “&d” che attraverso un cast è trasformata in un array di byte di lunghezza pari alla sua dimensione massima. Questa operazione è fatta con il cast a (char*) ovvero un puntatore che alloca tanti byte quanti sono i dati effettivamente presenti nella struct con un limite superiore che è imposto dal secondo argomento mediante l’istruzione sizeof che determina la dimensione massima della struct che è pari alla somma delle dimensioni di tutti i campi che la compongono.
La stessa procedura con il metodo read avviene per trasferire i dati binari letti dal file nella struct definita per accogliere i dati.
Se ti interessa approfondire le struct puoi leggere questo articolo:

Un programma completo per la gestione di file binari sempre sequenziali è su Github al seguente link

Video della Lezione