Skip to content

Leggere e Scrivere File

Quando il tuo programma termina, tutte le variabili spariscono. Se vuoi conservare i dati — i voti degli studenti, un punteggio di un gioco, una lista della spesa — devi salvarli su un file.

Con i file puoi anche leggere dati preparati in anticipo, senza dover inserire tutto a mano ogni volta.

In C++ si usa la libreria <fstream> (abbreviazione di “file stream”):

ClassePer cosa serve
ofstreamScrivere su file
ifstreamLeggere da un file
fstreamLeggere E scrivere
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ofstream file("saluto.txt"); // apre (o crea) il file in scrittura
if (file.is_open()) { // controlla sempre che sia aperto!
file << "Ciao, mondo!" << endl;
file << "Questa è la seconda riga." << endl;
file.close(); // chiudi il file quando hai finito
cout << "File scritto con successo." << endl;
} else {
cout << "Errore: impossibile aprire il file." << endl;
}
return 0;
}

Questo crea il file saluto.txt nella stessa cartella del programma. Se esiste già, viene sovrascritto.

Per aggiungere righe in fondo a un file già esistente (senza cancellarlo), usa ios::app:

ofstream file("diario.txt", ios::app); // "app" = append (aggiungi in coda)
if (file.is_open()) {
file << "Oggi ho imparato i file in C++." << endl;
file.close();
}
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
ifstream file("saluto.txt"); // apre il file in lettura
if (file.is_open()) {
string riga;
while (getline(file, riga)) { // legge una riga alla volta
cout << riga << endl;
}
file.close();
} else {
cout << "Errore: file non trovato." << endl;
}
return 0;
}

getline(file, riga) legge una riga intera. Quando non ci sono più righe, il ciclo si ferma da solo.

Leggere parola per parola o numero per numero

Section titled “Leggere parola per parola o numero per numero”

Se il file contiene dati separati da spazi o da righe, puoi leggere con >>:

// Leggere parole
ifstream file("parole.txt");
string parola;
while (file >> parola) { // legge una parola alla volta
cout << parola << endl;
}
file.close();
// Leggere numeri e calcolare la media
ifstream file2("numeri.txt");
int numero, somma = 0, contatore = 0;
while (file2 >> numero) {
somma += numero;
contatore++;
}
if (contatore > 0) {
cout << "Media: " << (double)somma / contatore << endl;
}
file2.close();

Se ogni riga del file contiene più valori (es. nome e voto separati da spazio):

// Il file "dati.txt" contiene:
// Alice 8.5
// Bob 7.2
// Carlo 9.0
ifstream file("dati.txt");
string nome;
double voto;
while (file >> nome >> voto) { // legge nome e voto insieme
cout << nome << ": " << voto << endl;
}
file.close();
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
// Chiede i voti all'utente e li salva nel file
void salvaVoti(const string& nomefile) {
ofstream file(nomefile);
if (!file.is_open()) {
cout << "Errore nella creazione del file." << endl;
return;
}
int n;
cout << "Quanti studenti? ";
cin >> n;
for (int i = 0; i < n; i++) {
string nome;
double voto;
cout << "Nome studente " << (i+1) << ": ";
cin >> nome;
cout << "Voto: ";
cin >> voto;
file << nome << " " << voto << endl; // scrive una riga per studente
}
file.close();
cout << "Dati salvati in " << nomefile << endl;
}
// Legge il file e stampa i voti con la media
void leggiVoti(const string& nomefile) {
ifstream file(nomefile);
if (!file.is_open()) {
cout << "File non trovato: " << nomefile << endl;
return;
}
cout << "\n=== Voti salvati ===" << endl;
string nome;
double voto, somma = 0;
int contatore = 0;
while (file >> nome >> voto) {
cout << nome << ": " << voto << endl;
somma += voto;
contatore++;
}
if (contatore > 0) {
cout << "Media classe: " << somma / contatore << endl;
}
file.close();
}
int main() {
string nomefile = "registro.txt";
salvaVoti(nomefile); // salva i voti su file
leggiVoti(nomefile); // rilegge e stampa
return 0;
}
  • Verifica sempre file.is_open() prima di usare il file
  • Chiudi il file con file.close() quando hai finito
  • Se dimentichi di chiudere, il file viene chiuso automaticamente quando l’oggetto viene distrutto (ma è buona abitudine chiuderlo esplicitamente)
  • Per aggiungere contenuto senza cancellare, usa ios::app
  • Usa cerr per i messaggi di errore relativi ai file, non cout