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;
}