PDA

View Full Version : [C++]Caricare file di testo su string


d0c1Le.Killah
01-09-2008, 10:48
Ciao a tutti. Ho un semplice quesito da porre, anche se comunque non ho trovato una soluzione (sebbene stia cercando su google inutilmente da un sacco di tempo).
In pratica ho bisogno di copiare il contenuto di un file su una stringa. Ho provato a usare questo codice:

#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char **argv) {
char a[200];
fstream f1;
f1.open("a.txt",ios::in);
if(!f1)
exit(EXIT_FAILURE);
while(f1 >> a)
cout << a << endl ;
f1.close();
return 0;

}

ma ciò che io voglio è usare un oggetto string, non un vettore di char, e sopratutto la cui dimensione sia proporzionata al numero di caratteri nel file. Se scrivo

while(f1 >> x)

con x di tipo string, ho un errore (non è previsto l'overloading con string credo)
Quali metodi usare?
Devo per forza usare char e poi convertire il risultato finale? non c'è niente di più pratico? E per allocare dinamicamente, devo necessariamente usare un for in cui sfoglio tutto il file e vedo la sua dimensione?
Infine ho questo dubbio: finora ho utilizzato stringhe dichiarate staticamente. Essendo molto lunghe (anche molte decine di kb), ho dovuto spezzarle in più linee di codice. Nel momento in cui caricassi tutto il file nella stringa, potrei avere problemi di compilazione o peggio ancora a run-time?

Grazie mille per l'aiuto!!!!!!!!

tomminno
01-09-2008, 12:33
Se il file non è binario puoi usare la funzione getline di string:

while(getline(stream, outputString))
...

d0c1Le.Killah
01-09-2008, 14:23
Ciao. Il file non è binario.
Grazie per l'interessamento, ma neanche la soluzione da te data sembra funzionare. Ho degli errori compilando questo codice:

#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char **argv) {
string a;
fstream f1;
f1.open("a.txt",ios::in);
if(!f1)
exit(EXIT_FAILURE);
while(iostream::getline(f1, a))
cout << endl ; //ad esempio, ma nn va lo stesso
f1.close();
return 0;

}

Noixe
01-09-2008, 14:40
Puoi caricare una riga di un file di testo in una stringa cosi:


#include <iostream>
#include <fstream>
#include <string>


int main() {

std::string s;
std::ifstream myfile ("prova.txt", std::ios_base::in);

std::getline (myfile, s);

std::cout << s << std::endl;

return 0;
}

Ciao

d0c1Le.Killah
01-09-2008, 14:45
GRAZIE! Sapevo erano 10 linee di codice, ma non le trovavo da nessuna parte :) era il metodo che cercavo... ora posso metterci tutti i controlli del caso.

Noixe
01-09-2008, 15:13
Se ad esempio vuoi leggere riga per riga, puoi fare cosi:



do {
std::getline (myfile, s, '\n'); // Il terzo paramentro indica fino a quando deve leggere la stringa, in questo caso e' il carattere di ritorno a capo

// fai quello che vuoi con il contenuto di s

}
while (!myfile.eof()); // Finché non raggiunge la fine del file.

Ciao

d0c1Le.Killah
01-09-2008, 16:01
Si beh certo, ora posso fare i vari giochetti... ovviamente col codice di prima leggevo fino alla fine del testo (EOF); con quest'ultimo invece scelgo il carattere delimitatore.
Ti ringrazio per l'interessamento, ora è tutto chiaro!
:D