Leggere per intero un file txt

swaqpoli
ciao a tutti!

c'è un modo per leggere un file di testo non riga per riga ma intero?
mi spiego meglio:
tra le tante cose da implementare, devo aprire un file di testo e visualizzare su schermo il suo contenuto.
ho fatto:

string s;
if(!file)
cout<<"Errore: file non trovato!"<
while(file.good())
{
getline(file, s);
cout<<"il contenunto del file è: "< cout< }
file.close();

il mio file è un discorso composto di più righe.
appena vado a eseguire il mio codice c++ quello che si visualizza è:

il contenuto del file è:
prima riga
il contenuto del file è:
seconda riga
il contenuto del file è:
terza riga

c'è un modo per ottere il contenuto del file tutto insieme? cioè visualizzare in output questo?

il contenuto del file è:
prima riga
seconda riga
terza riga

grazie infinite per l'attenzione

Risposte
xsl
Se è solo un problema di output, allora ti basta spostare
cout<<"il contenunto del file è: "<<endl;

e metterlo prima del while.

Se invece intendi proprio leggere tutto il testo che sta nel file senza doverlo scandire riga per riga, dovresti cercare se in C++ si possono creare classi/tipi di dati serializzabili in modo tale da salvare il loro stato all'interno di un file e nel momento in cui si vuole leggere l'intero contenuto di quel file basta caricare lo stato dell'oggetto memorizzato.
Per favorire ciò devi usare flussi di lettura e scrittura che ti permettono di fare questo genere di operazioni.

apatriarca
L'ovvia soluzione nel tuo caso sarebbe quella già consigliata da xsl:
cout<<"il contenunto del file è: "<<endl;
while(file.good())
{
    getline(file, s);
    cout<<s<<endl<<endl; 
}
file.close();


Se invece volessi leggere tutto il file per passarlo ad una qualche altra funzione (è il caso per esempio di alcune funzione delle OpenGL), allora puoi leggere riga per riga e concatenare
ifstream &read_file(ifstream &fin, string &s)
{
    string r;
    while (file.good()) {
        getline(fin, r);
        s += r;
    }
    return fin;
}

oppure puoi usare la seguente tecnica (forse richiede che il file sia aperto in modalità binaria ma non ne sono certo)
ifstream &read_file(ifstream &fin, string &s)
{
    fin.seekg(0, ios::end); // porta la posizione corrente alla fine del file
    int len = fin.tellg(); // restituisce la posizione corrente nello stream (dimensione del file)
    fin.seekg(0, ios::beg); // torna all'inizio del file

    char *buffer = new char[len+1]; // crea un buffer abbastanza grande da contenere tutto il file
    
    fin.read(buffer, len);
    buffer[len] = '\0'; // aggiungo terminatore di stringa che non mi sembra venga inserito in automatico

    s += buffer;

    return fin;
}

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.