1 of 8

File binari in C++

3^ INFORMATICO - IIS PASCAL�DIPARTIMENTO INFORMATICA

2 of 8

PREREQUISITI

  • Conoscenza delle strutture dati statiche array e struct
  • Conoscenza delle primitive di accesso ai file

OBIETTIVI

  • Saper leggere e scrivere dati su file binari

2

3 of 8

File dati (o file binari)

3

from Wikipedia

Un file binario (a volte anche semplicemente "binario"), in Informatica, è un file che può contenere qualsiasi tipo di dati, codificato in codice binario a scopo di archiviazione o utilizzo (ad esempio file documenti che contengono testo formattato). ��Molti formati di file binari contengono parti che possono essere interpretate come testo, ma si distinguono per definizione dai file di testo veri e propri: un file binario è un file che non contiene solo semplice testo.��I file binari sono solitamente concepiti come sequenze di byte: le singole cifre bit che costituiscono il file sono raggruppate in gruppi di otto. �Questi file contengono byte che devono generalmente essere interpretati in modo diverso dai caratteri: i file compilati sono un esempio (i programmatori si riferiscono spesso al codice oggetto col termine "binario"), ma si può trattare di immagini, musica, dati compressi, o di qualsiasi altro tipo.

Alcuni file binari contengono header, cioè contenitori di metadata usati dai programmi associati ai file per riconoscerne ed interpretarne il contenuto. Ad esempio, un file GIF può contenere più immagini, e gli header sono utilizzati per identificare e descrivere ciascun blocco di dati.

4 of 8

Accesso ai file in C++

4

primitive

Abbiamo già incontrato le primitive di accesso ai file di testo messe a disposizione dalla libreria fstream

apertura � es: f = ifstream(“miofile.txt”) // apre in lettura� f = ofstream(“miofile.txt”) // apre in scrittura, se esiste sovrascrive, se non esiste crea� f = ofstream(“miofile.txt”, ios::app) // apre in scrittura, se esiste appende, se non esiste crea�� f = ofstream(“miofile.txt”, ios::binary) // apre in scrittura in modalità binaria� f = ifstream(“miofile.txt”, ios::binary) // apre in lettura in modalità binaria

chiusura

f.close() // chiude il file�

lettura e scrittura // utilizza gli operatori << , >> e getline�

5 of 8

Accesso ai file in C++

5

scrivere una struct su un file binario

I file binari ci permettono di scrivere dati su file mantenendo la struttura delle struct (record)

la funzione reinterpret_cast�trasforma una serie di caratteri�nella struttura del tipo specificato��in questo caso Persona

apre un file binario�in append

6 of 8

Accesso ai file in C++

6

leggere una struct da file binario

La lettura è sempre “char-based”. Il cast dinamico lo trasforma in una struct di un certo tipo

la funzione reinterpret_cast�trasforma una serie di caratteri�nella struttura del tipo specificato

apre un file binario�in lettura

tipo dato del cast Persona

7 of 8

Accesso ai file in C++

7

struttura di una struct per file binari

Abbiamo detto che la funzione reinterpret_cast trasforma una serie di caratteri nella struttura del tipo specificato.

E’ FONDAMENTALE che ogni campo della struct abbia una dimensione DEFINITA in bytes!��Per questo motivo, se dobbiamo usare file di struct, queste devono avere campi di lunghezza definita.�Non va bene “string”, che è dinamica!

In questa struct �i primi 4 bytes sono l’intero ID, �poi altri 4 il float value,�poi altri 20 la stringa name

8 of 8

ESERCIZIO

8

Sia data la struct così definita:

struct Atleta {

char nome[50];

char cognome[50];

int eta;

int altezza;

float record_personale;

};

Il file atleti.dat contiene dati relativi ad un certo numero di atleti.��Scarica il file atleti.dat da qui e scrivi un programma che

  • legga i dati dal file
  • costruisca una struttura dinamica adatta a gestire tali dati
  • stampi a video i dati
  • ordini i dati per cognome atleta
  • stampi a video i dati ordinati