Leggere e Scrivere File
Leggere e scrivere file in C++
Section titled “Leggere e scrivere file in C++”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.
Le tre classi per i file
Section titled “Le tre classi per i file”In C++ si usa la libreria <fstream> (abbreviazione di “file stream”):
| Classe | Per cosa serve |
|---|---|
ofstream | Scrivere su file |
ifstream | Leggere da un file |
fstream | Leggere E scrivere |
Scrivere su un file
Section titled “Scrivere su un file”#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.
Aggiungere testo senza cancellare
Section titled “Aggiungere testo senza cancellare”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();}Leggere da un file
Section titled “Leggere da un file”#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 paroleifstream file("parole.txt");string parola;while (file >> parola) { // legge una parola alla volta cout << parola << endl;}file.close();
// Leggere numeri e calcolare la mediaifstream 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();Leggere più valori per riga
Section titled “Leggere più valori per riga”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();Esempio pratico: registro voti su file
Section titled “Esempio pratico: registro voti su file”#include <iostream>#include <fstream>#include <string>using namespace std;
// Chiede i voti all'utente e li salva nel filevoid 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 mediavoid 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;}Regole pratiche
Section titled “Regole pratiche”- 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
cerrper i messaggi di errore relativi ai file, noncout