C++ leggere e scrivere su file con gli stream
Link sponsorizzati
Una cosa molto importante quando si tratta di programmazione è la lettura e la scrittura da file. Per scrivere su file in C++, si possono usare le vecchie funzioni del C (fopen, fread, fwrite e così via), oppure, si possono usare le classi ifstream e ofstream rispettivamente per leggere e scrivere da file.
Vediamo ora un esempio dell’utilizzo della classe ifstream per leggere le righe di un file esistente.
#include <fstream> //header necessario per ifstream!
using namespace std;
int main() {
ifstream f("file.txt"); //nome del file da aprire, si può mettere anche il percorso (es C:\\file.txt)
string s;
if(!f) {
cout< <"Il file non esiste!";
return -1;
}
while(f.good()) //fino a quando c'è qualcosa da leggere ..
{
getline(f, s); //legge tutta la riga dal file e la mette nella variabile s
cout<<s<<endl;
}
f.close(); //chiude il file
return 0;
}
Il codice è abbastanza chiaro e commentato, se avete problemi chiedete pure nei commenti!
Ora vediamo come usare la classe ofstream per scrivere invece sul file!
Link sponsorizzati
#include <fstream> //header necessario per ofstream!
using namespace std;
int main() {
ofstream f("file.txt"); //se il file non esiste lo crea, altrimenti lo sovrascrive!
if(!f) {
cout< <"Errore nella creazione del file!";
return -1;
}
f << "ciao"<<endl //si può inserire qualsiasi cosa nello stream, stringhe
<< 1 << endl //numeri, con virgola o meno
<< 1.3 << endl; //l'endl indica che ogni cosa viene scritta a capo, se fosse omesso scriverebbe tutto su una linea
f.close(); //chiudo il file
cout<<"Scrittura avvenuta con successo!";
return 0;
}
Questo codice, come scritto sopra, crea un file e, se esiste, lo sovrascrive e ci piazza dentro quello che abbiamo messo noi nel codice. E’ utile però aprire il file in modalità append, ovvero posizionando il puntatore alla fine del file e continuare a scrivere altre cose. Questo è un esempio!
#include <fstream> //header necessario per ofstream!
using namespace std;
int main() {
ofstream f("file.txt", ios::app); //apre il file in modalità append, lasciando intatto quello che c'è e scrivendo alla fine
if(!f) {
cout< <"Errore nell'apertura del file!";
return -1;
}
f << "nuove righe"<<endl //si può inserire qualsiasi cosa nello stream, stringhe
<< 2 << endl //numeri, con virgola o meno
<< 4.3 << endl; //l'endl indica che ogni cosa viene scritta a capo, se fosse omesso scriverebbe tutto su una linea
f.close(); //chiudo il file
cout<<"Scrittura avvenuta con successo!";
return 0;
}
Notate la riga ofstream f("file.txt", ios::app); in questo caso ios::app ci dice di aprire il file in modalità append. Ci sono altre varianti, come ios::binary, per creare un file binario.
E’ possibile anche usare la classe generica fstream, in quel caso la modalità di apertura del file vanno specificate nel secondo paramentro. Ad esempio:
#include <fstream> //header necessario per fstream!
using namespace std;
int main() {
fstream f("file.txt", ios::out); //apre il file in scrittura (cancellando quello che già c'era
string s;
if(!f) {
cout< <"Errore nella creazione del file!";
return -1;
}
f << "Roba che ho scritto nel file!"; //scrivo nel file
f.close();
cout<<"Adesso apro il file appena scritto:\n\n";
f.open("file.txt", ios::in); //apro lo stesso file che ho creato sopra però ora in lettura!
while(f.good()) {
getline(f, s); //preleva una riga dal file
cout<<s<<endl;
}
f.close();
}
In alcuni codici al posto di ios::in o ios::out, è possibile vedere anche fstream::in o fstream::out. E’ indifferente, hanno la stessa funzione e il flag viene letto correttamente in entrambi i casi!
Questi sono i flag che si possono usare in modalità di apertura del file:
- app (append) Set the stream’s position indicator to the end of the stream before each output operation.
- ate (at end) Set the stream’s position indicator to the end of the stream on opening.
- binary (binary) Consider stream as binary rather than text.
- in (input) Allow input operations on the stream.
- out (output) Allow output operations on the stream.
- trunc (truncate) Any current content is discarded, assuming a length of zero on opening.
Link sponsorizzati


ciao! ma è possibile utilizzare una string per dare il nome al file??
perchè vorrei che il programma permetta di dare un nome al file da salvare. Come posso fare?
E’ possibile far usufruire alla funzione f , per scrivere su file, un’altra funzione che utilizzo per la stampa a video, in modo tale che la copi esattamente come viene stampata a video?? la devo copiare pari pari nel corpo di f o basta che faccia f>>print()? Grazie
Si, è possibile. basta creare una variabile di tipo string che usi per leggere il nome del file tramite cin. Poi, quando crei il file al posto di “file.txt” metti la tua stringa.
La seconda domanda non l’ho capita
1)quindi in pratica la sintassi sarebbe questa?
string s;
fstream f(s”.txt”)
2) Posso far utilizzare a “f” una funzione? ad esempio;
f>>print()
così mi scrive su file esattamente come esce su video.
spero di essere stato abbastanza chiaro….
Si… ma ovviamente sarebbe
Ciao!
Ciao! Molto utile la tua spiegazione credo di aver capito tutto! Solo che ho due problemi che non riesco a risolvere..
(1) error C2065: ‘getline’ : undeclared identifier
(2) error C2679: binary ‘<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits,class std::allocator >’ (or there is no acceptable conversion)
Come mai? Grazie mille in anticipo
Che compilatore usi?
Comunque in ogni caso prova a mettere tra gli include
e vedi se riesci a risolvere
Visual C++ 6.0, comunque ho provato con #include e ora funziona! Grazie infinite! ^_^
Ciao! Scusa ancora il disturbo, ma è possibile fare della lettura da un file una funzione separata dal main? Per esempio “void dati()”? Io ci ho provato ma mi da sempre problemi legati al getline (anche se ho messo #include e a “string s” dove mi dice che “string” ed “s” non sono dichiarati e che manca il “;” tra di essi… o.O
Ciao Whitearrow, si, ovviamente si può fare… però devi incollarmi il codice che hai scritto in modo che possa correggerlo.
L’unica cosa è che farlo qui sui commenti è un po’ palloso, per via del poco spazio che abbiamo. Se vuoi puoi registrarti al nostro forum (è gratuito, ovviamente) http://codesnippet.biz/forum/
e postare il problema nella sezione C\C++ ( http://codesnippet.biz/forum/cc/ )
Ciao!
ciao, mi puoi dire un algoritmo ( in C++ ) di scrittura e lettura di una Coda su un file di testo ( o binario ) grazie
CIao, questo articolo ( http://codesnippet.biz/c-piu-piu-esempio-di-inserimento-e-stampa-in-lista-con-puntatori/ ) parla di come scrivere su una lista. La coda è simile basta adattare questo esempio e poi scrivere su un file.
Ciao!