Imparare a programmare in C++ – #9 – scrivere e leggere un file

Imparare a programmare in C++ – #9 – scrivere e leggere un file

Imparare a programmare in C++ – #9 – scrivere e leggere un file: la libreria fstream permette di leggere e scrivere contenuto di testo all’interno di un file.

Tempo di lettura stimato: 6 minuti

Imparare a programmare in C++ – #9 – scrivere e leggere un file

La libreria fstream, permette di aggiungere al c++ gli strumenti (in questo caso le classi) adatte alla lettura e scrittura dei file.

Questa libreria crea un collegamento o un flusso (stream) tra il nostro programma ed il file.

Questo flusso viene aperto dal comando ofstream per la scrittura e dal comando ifstream per la lettura.

Per poter utilizzare le funzioni di lettura e scrittura dovremo includere la libreria nel nostro progetto scrivendo:

#include <fstream>

Prima di poter iniziare la scrittura o la lettura di un file dobbiamo avviare il flusso dati, scrivendo:

// SCRITTURA
ofstream NomeFlussoDati("nome_file);
// LETTURA
ifstream NomeFlussoDati("nome_file);

Come scrivere un file di testo in C++

Per poter scrivere un file di testo dovremo prima collegare il programma ad un file tramite ofstream, poi preparare la stringa da inviare, quindi inviarla al file.

Al termine del flusso di dati è sempre consigliabile chiudere il flusso scrivendo NomeFlusso.close();

La chiusura del flusso dati permette di liberare spazio in memoria ed ottimizzare quindi il programma.

In questo esempio vediamo come creare un collegamento al file elenco.txt e scrivere al suo interno.

Quando non si specifica il percorso del file di testo, questo viene sempre cercato nella stessa cartella il cui si trova il file eseguibile.

Se quindi il nostro programma si trova sul desktop, il file txt verrà creato sul desktop.

#include <iostream>
#include <fstream>
using namespace std;

int main() 
{
    ofstream Documento("elenco.txt");
	string TestoDaScrivere = "Questo testo va inserito nel documento.";
	Documento << TestoDaScrivere;
	Documento.close();
	cout << "Documento creato correttamente.";
 return 0;
}

Come leggere il contenuto di un file di testo in C++

Per poter leggere il contenuto di un file di testo, andiamo a creare un flusso in lettura utlizzando ifstream, quindi tramite il ciclo while, andiamo a leggere riga per riga il file di testo copiando il contenuto in una variabile, quindi mostriamo di volta in volta la variabile.

Al termine chiudiamo ancora una volta il flusso scrivendo NomeFlusso.close();

#include <iostream>
#include <fstream>
using namespace std;

int main() 
{
    	string RigheLette;
	ifstream DocumentoCaricato("elenco.txt");
	while (getline(DocumentoCaricato, RigheLette))
	{
		cout << RigheLette << endl;
	}
	DocumentoCaricato.close();
	cout << "FINE DOCUMENTO.";
}

Scrivere più righe in un file di testo in C++

In questo esempio vediamo come inviare più stringhe al file di testo.

#include <iostream>
#include <fstream>
using namespace std;

int main() 
{
   ofstream Documento("elenco.txt");
	string TestoDaScrivere;
	string Nuova;
	// RIGA 1
	cout << "Cosa vuoi scrivere sulla prima riga?" << endl;
	getline(cin, TestoDaScrivere);
	Documento << TestoDaScrivere.append("\n");
	// RIGA 2
	cout << "Cosa vuoi scrivere sulla seconda riga?" << endl;
	getline(cin, TestoDaScrivere);
	Documento << TestoDaScrivere.append("\n");
	// RIGA 3
	cout << "Cosa vuoi scrivere sulla terza riga?" << endl;
	getline(cin, TestoDaScrivere);
	Documento << TestoDaScrivere.append("\n");
	// CHIUSURA
	Documento.close();
	cout << "Documento creato correttamente.";
}

Questo codice presenta 2 elementi nuovi, che non abbiamo ancora visto:

  • getline();
  • .append();

getline()

Tramite getline il C++ prende il contenuto dell’intera riga (lo abbiamo utilizzato per leggere il contenuto di un file di testo.

In questo esempio invece lo utilizziamo per scrivere su un file di testo.

Il motivo per cui utilizziamo getline(cin, TestoDaScrivere); e non semplicemente cin >> TestoDaScrivere è che nel secondo casonon verrebbero copiati testi che contengono degli spazi.

Infatti se il contenuto della mia variabile fosse “Mario Bianchi”, con il semplice cin mi troverei “Mario”.

Il getline invece legge l’interno contenuto fino a fine riga.

.append()

L’attributo append permette di unire 2 stringhe, quindi scrivere:

string nome = "Mario";
string cognome = "Bianchi";
string NomeCompleto = nome + cognome;

equivale a scrivere:

string nome = "Mario";
string cognome = "Bianchi";
string NomeCompleto = nome.append(cognome);

Nel nostro esempio utilizziamo .append per aggiungere \n e mandare a capo il testo dopo ogni inserimento.

ESERCITAZIONE

Per l’esercizio di questo tutorial, crea un programma che permetta all’utente di inserire una lista di nomi, ad esempio l’elenco di alunni presenti in una classe.

Il programma deve chiedere prima se si vuole leggere o scrivere il file.

In caso di lettura mostrare l’elenco degli alunni (uno per ogni riga).

In caso di scrittura, chiedere prima quanti alunni inserire e poi far inserire il nome di ognuno di loro.

Regole:

  • Si può scegliere se inserire solo il nome o nome e cognome
  • Salvare i dati in un file txt nella stessa cartella del programma

EXTRA (Facoltativo): Quando si legge l’elenco dei nomi alla fine aggiungere anche il numero di alunni presenti.

Mostra soluzione

#include <iostream>
#include <fstream>
using namespace std;

int main() 
{
	// VARIABILI GENERALI
	int NumeroAlunni = 0;
	string NomeAlunno = "";
	// CHIEDI ALL'UTENTE SE VUOLE CARICARE I DATI O SCRIVERLI
	int OpzioneScelta;
	cout << "Digita 1 per leggere l'elenco degli alunni." << endl;
	cout << "Digita 2 per inserire gli alunni." << endl;
	cin >> OpzioneScelta;
	if (OpzioneScelta == 1)
	{
		// CARICA I DATI
		ifstream CaricaDocumento("alunni.txt");
		string NomeAlunno;
		cout << "ELENCO DEGLI ALUNNI:" << endl;
		while (getline (CaricaDocumento, NomeAlunno))
		{
			cout << NomeAlunno << endl;
			NumeroAlunni++; //extra
		}
		cout << "Il numero totale di alunni e': " << NumeroAlunni << endl; //extra
		// CHIUDI COLLEGAMENTO AL DOCUMENTO
		CaricaDocumento.close();
	}
	else if (OpzioneScelta == 2)
	{
		// AVVIA FLUSSO
		ofstream CaricaDocumento("alunni.txt");
		cout << "Quanti alunni vuoi inserire?" << endl;
		cin >> NumeroAlunni;
		int Contatore = 1;
		for (int a = 0; a <= NumeroAlunni; a++)
		{
			cout << "Scrivi il nome:" << endl;
			getline(cin,NomeAlunno);
			if (NomeAlunno != "")
			{
				CaricaDocumento << NomeAlunno.append("\n");
			}
		}
		//CHIUDI FLUSSO
		CaricaDocumento.close();
		// MESSAGGIO CHIUSURA
		cout << "Tutti gli alunni sono stati caricati";
	}
	else
	{
		// ALTERNATIVA IN CASO DI CARATTERE DIVERSO DA 1 o 2
		cout << "SUPER MEGA ERRORE !!!! CATASTROFE !!! DISTRUZIONE TOTALE !!! No, per questa volta siamo salvi pero' la prossima volta digita 1 o 2.";
	}
 return 0;
}

Video

Claudio Masci

Sono innanzitutto un appassionato di informatica e tecnologia in generale. Lavoro in ambito informatico da circa 16 anni, spaziando in diversi campi, andando dalla programmazione web, allo sviluppo di software, dalla grafica alla modellazione 3d ed al video editing, ho sempre voluto approfondire ogni aspetto e questo mi ha permesso di lavorare in diversi ambiti informatici.

Rispondi