Memoria che resta
Variabili, vettori e matrici vivono nella RAM: spariscono appena il programma termina (memoria volatile). Un file è salvato su disco e resta anche dopo: lo puoi rileggere alla prossima esecuzione, condividere, modificare.
Inoltre un file può contenere tanti dati e di numero variabile: non devi sapere in anticipo quante righe ci sono, le leggi finché non finiscono.
ifstream e ofstream
Con #include <fstream>: ofstream per scrivere (output) e ifstream per leggere (input). La cosa comoda è che si usano esattamente come cout e cin, con gli stessi operatori << e >>. Ricordati sempre di controllare l'apertura e di chiudere il file.
Scrivere con <<
Un ofstream con l'operatore << funziona come cout: il testo, invece che a schermo, finisce nel file. Puoi scrivere numeri, stringhe e separatori.
#include <fstream> ofstream fout("dati.txt"); fout << 1 << " " << "Ba" << endl; // scrive: 1 Ba fout << 2 << " " << "Citrulo" << endl; // scrive: 2 Citrulo fout.close();
Leggere con >>
Un ifstream con l'operatore >> funziona come cin: legge un valore alla volta, saltando automaticamente spazi e a-capo. È perfetto per i file con campi separati da spazi. Il ciclo while (fin >> …) continua finché ci sono dati da leggere.
Per esempio, dato il file dati.txt con un numero e un nome per riga:
ifstream fin("dati.txt"); if (!fin) { cout << "Errore nell'apertura del file"; return 1; } int numero; string nome; while (fin >> numero >> nome) { // legge il numero, poi il nome cout << "Numero: " << numero << " - Nome: " << nome << endl; } fin.close();
Leggere intere righe con getline
Quando una riga contiene spazi (una frase, un nome e cognome), >> si fermerebbe al primo spazio. Allora si usa getline, che legge l'intera riga in una stringa.
ifstream fin("diario.txt"); string riga; while (getline(fin, riga)) // una riga intera alla volta cout << riga << endl; fin.close();
I file CSV
Un CSV (Comma-Separated Values) è un file di testo dove ogni riga è un record e i campi sono separati da virgole. È il formato con cui si scambiano tabelle (lo aprono anche Excel e Google Fogli): perfetto per salvare un vettore di struct.
#include <fstream> #include <string> ifstream fin("voti.csv"); if (!fin) { cout << "File non trovato"; return 1; } string riga; while (getline(fin, riga)) { // una riga alla volta int pos = riga.find(','); // posizione della virgola string nome = riga.substr(0, pos); float voto = stof(riga.substr(pos + 1)); cout << nome << " ha preso " << voto << endl; } fin.close();
Gli esercizi
Base: scrivere e leggere file .txt, .dat e .csv. Avanzati: i file legati a vettori, matrici e struct (salvataggio e caricamento di record). 10 esercizi ciascuna.
Soluzioni · File base
Soluzioni · File avanzati
Gli esercizi 6, 7, 8, 10 (classifica ordinata, report statistico, conteggio per genere, aggiorna magazzino) combinano questi stessi schemi: caricaCsv in un vettore di struct, elaborazione e salvaCsv.