Intro: L'operazione eseguita su un oggetto per associarlo ad un file reale è nota come aprire un file. Un file aperto è rappresentato all'interno di un programma da uno stream (cioè un oggetto di una di queste classi) e qualsiasi operazione di input o output eseguita su questo oggetto stream sarà applicata al file fisico ad esso associato.
Per aprire un file con un oggetto stream usiamo la sua funzione membro open:
open (filename, mode);
dove filename è una stringa che rappresenta il nome del file da aprire, e mode è un parametro opzionale con una combinazione dei seguenti flag:
- ios::in Open per operazioni di input.
- ios::out Aperto per operazioni di output.
- ios::binary Aperto in modalità binaria.
- ios::ate Imposta la posizione iniziale alla fine del file. (Se questo flag non è impostato, la posizione iniziale è l'inizio del file.)
- ios::app Tutte le operazioni di output sono eseguite alla fine del file, aggiungendo il contenuto al contenuto corrente del file.
- ios::trunc Se il file è aperto per le operazioni di output ed esisteva già, il suo contenuto precedente viene cancellato e sostituito da quello nuovo.
Tutti questi flag possono essere combinati usando l'operatore bitwise OR (|). For example, if we want to open the file example.bin in binary mode to add data we could do it by the following call to member function open:
- ofstream myfile;
- myfile.open ("example.bin", ios::out | ios::app | ios::binary);
Each of the open member functions of classes ofstream, ifstream and fstream has a default mode that is used if the file is opened without a second argument:
class default mode parameter
ofstream ios::out
ifstream ios::in
fstream ios::in | ios::out
Per le classi ifstream e ofstream, ios::in e ios::out sono automaticamente e rispettivamente assunti, anche se una modalità che non li include è passata come secondo argomento alla funzione membro open (i flags sono combinati).
Per fstream, il valore predefinito viene applicato solo se la funzione viene chiamata senza specificare alcun valore per il parametro mode. Se la funzione viene chiamata con qualsiasi valore in quel parametro, la modalità predefinita viene sovrascritta, non combinata.
I flussi di file aperti in modalità binaria eseguono operazioni di input e output indipendentemente da qualsiasi considerazione sul formato. I file non binari sono conosciuti come file di testo, e alcune traduzioni possono verificarsi a causa della formattazione di alcuni caratteri speciali (come i caratteri newline e carriage return).
Siccome il primo compito che viene eseguito su un flusso di file è generalmente quello di aprire un file, queste tre classi includono un costruttore che chiama automaticamente la funzione membro open e ha esattamente gli stessi parametri di questo membro. Pertanto, avremmo anche potuto dichiarare il precedente oggetto myfile e condurre la stessa operazione di apertura nel nostro esempio precedente scrivendo:
ofstream myfile ("example.bin", ios::out | ios::app | ios::binary);
Combinando la costruzione dell'oggetto e l'apertura del flusso in una singola dichiarazione. Entrambe le forme per aprire un file sono valide ed equivalenti. Per controllare se un flusso di file è stato aperto con successo, potete farlo chiamando il membro is_open. Questa funzione membro restituisce un valore bool di true nel caso in cui effettivamente l'oggetto stream sia associato ad un file aperto, o false altrimenti:
if (myfile.is_open()) { /* ok, procedere con l'output */ }