C++ leggere e scrivere su file con gli stream

lug 30th, 2009 | Filed under C++, Snippet

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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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:

  1. app (append) Set the stream’s position indicator to the end of the stream before each output operation.
  2. ate (at end) Set the stream’s position indicator to the end of the stream on opening.
  3. binary (binary) Consider stream as binary rather than text.
  4. in (input) Allow input operations on the stream.
  5. out (output) Allow output operations on the stream.
  6. trunc (truncate) Any current content is discarded, assuming a length of zero on opening.

Link sponsorizzati

Condividi l'articolo

Post correlati:

Tags: , ,
  1. DashKappei
    gen 20th, 2011 at 15:53

    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?

  2. DashKappei
    gen 20th, 2011 at 16:05

    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

  3. codesnippet
    gen 21st, 2011 at 00:22

    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

  4. DashKappei
    gen 21st, 2011 at 17:21

    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….

  5. codesnippet
    gen 22nd, 2011 at 13:30

    Si… ma ovviamente sarebbe

     f<<print();

    Ciao!

  6. Whitearrow
    mar 5th, 2011 at 18:20

    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 :)

  7. CodeSnippet
    mar 6th, 2011 at 09:08

    Che compilatore usi?

    Comunque in ogni caso prova a mettere tra gli include

    #include <string>

    e vedi se riesci a risolvere

  8. Whitearrow
    mar 7th, 2011 at 02:26

    Visual C++ 6.0, comunque ho provato con #include e ora funziona! Grazie infinite! ^_^

  9. Whitearrow
    mar 7th, 2011 at 09:38

    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

  10. CodeSnippet
    mar 7th, 2011 at 11:06

    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!

  11. Maurizio
    gen 24th, 2012 at 10:32

    ciao, mi puoi dire un algoritmo ( in C++ ) di scrittura e lettura di una Coda su un file di testo ( o binario ) grazie

  12. CodeSnippet
    gen 24th, 2012 at 12:19

    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!