Leggere per intero un file txt
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
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 è: "<
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
Se è solo un problema di output, allora ti basta spostare
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.
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.
L'ovvia soluzione nel tuo caso sarebbe quella già consigliata da xsl:
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
oppure puoi usare la seguente tecnica (forse richiede che il file sia aperto in modalità binaria ma non ne sono certo)
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; }