File e flussi C ++

Finora abbiamo utilizzato l'estensione iostream libreria standard, che fornisce cin e cout metodi per leggere rispettivamente dallo standard input e scrivere sullo standard output.

Questo tutorial ti insegnerà a leggere e scrivere da un file. Ciò richiede un'altra libreria C ++ standard chiamatafstream, che definisce tre nuovi tipi di dati:

Suor n Tipo di dati e descrizione
1

ofstream

Questo tipo di dati rappresenta il flusso di file di output e viene utilizzato per creare file e scrivere informazioni sui file.

2

ifstream

Questo tipo di dati rappresenta il flusso del file di input e viene utilizzato per leggere le informazioni dai file.

3

fstream

Questo tipo di dati rappresenta il flusso di file in generale e ha le capacità sia di ofstream che di ifstream, il che significa che può creare file, scrivere informazioni su file e leggere informazioni dai file.

Per eseguire l'elaborazione dei file in C ++, i file di intestazione <iostream> e <fstream> devono essere inclusi nel file sorgente C ++.

Apertura di un file

Un file deve essere aperto prima di poterlo leggere o scrivere su di esso. Oofstream o fstreamoggetto può essere utilizzato per aprire un file in scrittura. E l'oggetto ifstream viene utilizzato per aprire un file solo a scopo di lettura.

Di seguito è riportata la sintassi standard per la funzione open (), che è un membro degli oggetti fstream, ifstream e ofstream.

void open(const char *filename, ios::openmode mode);

Qui, il primo argomento specifica il nome e il percorso del file da aprire e il secondo argomento del file open() La funzione membro definisce la modalità in cui il file deve essere aperto.

Suor n Flag di modalità e descrizione
1

ios::app

Modalità di aggiunta. Tutto l'output in quel file verrà aggiunto alla fine.

2

ios::ate

Apri un file per l'output e sposta il controllo di lettura / scrittura alla fine del file.

3

ios::in

Apri un file per la lettura.

4

ios::out

Apri un file per la scrittura.

5

ios::trunc

Se il file esiste già, il suo contenuto verrà troncato prima di aprire il file.

Puoi combinare due o più di questi valori per ORing insieme. Ad esempio, se vuoi aprire un file in modalità di scrittura e vuoi troncarlo nel caso in cui già esiste, la seguente sarà la sintassi:

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );

In modo simile, puoi aprire un file a scopo di lettura e scrittura come segue:

fstream  afile;
afile.open("file.dat", ios::out | ios::in );

Chiusura di un file

Quando un programma C ++ termina, scarica automaticamente tutti i flussi, rilascia tutta la memoria allocata e chiude tutti i file aperti. Ma è sempre buona norma che un programmatore chiuda tutti i file aperti prima della fine del programma.

Di seguito è riportata la sintassi standard per la funzione close (), che è un membro degli oggetti fstream, ifstream e ofstream.

void close();

Scrittura su un file

Durante la programmazione C ++, scrivi le informazioni in un file dal tuo programma usando l'operatore di inserimento del flusso (<<) proprio come usi quell'operatore per visualizzare le informazioni sullo schermo. L'unica differenza è che usi un fileofstream o fstream oggetto invece del cout oggetto.

Leggere da un file

Si leggono le informazioni da un file nel programma utilizzando l'operatore di estrazione del flusso (>>) proprio come si utilizza quell'operatore per inserire le informazioni dalla tastiera. L'unica differenza è che usi un fileifstream o fstream oggetto invece del cin oggetto.

Leggere e scrivere esempio

Di seguito è riportato il programma C ++ che apre un file in modalità di lettura e scrittura. Dopo aver scritto le informazioni inserite dall'utente in un file chiamato afile.dat, il programma legge le informazioni dal file e le visualizza sullo schermo -

#include <fstream>
#include <iostream>
using namespace std;
 
int main () {
   char data[100];

   // open a file in write mode.
   ofstream outfile;
   outfile.open("afile.dat");

   cout << "Writing to the file" << endl;
   cout << "Enter your name: "; 
   cin.getline(data, 100);

   // write inputted data into the file.
   outfile << data << endl;

   cout << "Enter your age: "; 
   cin >> data;
   cin.ignore();
   
   // again write inputted data into the file.
   outfile << data << endl;

   // close the opened file.
   outfile.close();

   // open a file in read mode.
   ifstream infile; 
   infile.open("afile.dat"); 
 
   cout << "Reading from the file" << endl; 
   infile >> data; 

   // write the data at the screen.
   cout << data << endl;
   
   // again read the data from the file and display it.
   infile >> data; 
   cout << data << endl; 

   // close the opened file.
   infile.close();

   return 0;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente input e output di esempio:

$./a.out
Writing to the file
Enter your name: Zara
Enter your age: 9
Reading from the file
Zara
9

Gli esempi sopra fanno uso di funzioni aggiuntive dall'oggetto cin, come la funzione getline () per leggere la riga dall'esterno e la funzione ignore () per ignorare i caratteri extra lasciati dalla precedente istruzione di lettura.

Puntatori di posizione del file

Tutti e due istream e ostreamfornire funzioni membro per riposizionare il puntatore di posizione del file. Queste funzioni membro sonoseekg ("seek get") per istream e seekp ("seek put") per ostream.

L'argomento per seekg e seekp normalmente è un numero intero lungo. È possibile specificare un secondo argomento per indicare la direzione di ricerca. La direzione di ricerca può essereios::beg (impostazione predefinita) per il posizionamento relativo all'inizio di un flusso, ios::cur per il posizionamento relativo alla posizione corrente in un flusso o ios::end per il posizionamento rispetto alla fine di un flusso.

Il puntatore della posizione del file è un valore intero che specifica la posizione nel file come numero di byte dalla posizione iniziale del file. Alcuni esempi di posizionamento del puntatore di posizione del file "get" sono:

// position to the nth byte of fileObject (assumes ios::beg)
fileObject.seekg( n );

// position n bytes forward in fileObject
fileObject.seekg( n, ios::cur );

// position n bytes back from end of fileObject
fileObject.seekg( n, ios::end );

// position at end of fileObject
fileObject.seekg( 0, ios::end );