Voglio generare un elenco di nomi di file enumerati
file1.dat
file2.dat
…
Il seguente codice
#include<fstream>
for( int i=0; i<5; i++) {
std::ofstream fout( "file" + i + ".dat", std::ios );
//do stuff
fout.close();
}
sembra essere l'implementazione naturale. Sfortunatamente, l'intero i
è erroneamente concatenato alla stringa; inoltre, ofstream
accetta un char * (non una stringa) come argomento del file. Il seguente
#include <fstream>
#include <sstream>
string toString(int& i) {
std::stringstream ss;
ss << i;
return ss.str();
}
for( int i=0; i<5; i++) {
std::string fileName = "file" + toString(step) + ".dat";
std::ofstream fout( (char*)fileName.c_str(), std::ios );
//do stuff
fout.close();
}
funziona ma è ingombrante. (char*)fileName.c_str()
sembra particolarmente goffo. C'è un modo migliore per realizzare questo compito?
risposte:
7 per risposta № 1Una possibilità sarebbe boost::lexical_cast
:
std::ofstream fout(
("file" + boost::lexical_cast<std::string>(i) + ".dat").c_str(),
std::ios );
Non vi è alcun motivo per inserire il valore restituito di c_str()
passare a std::ofstream
costruttore come accetta a const char*
, che è esattamente cosa c_str()
ritorna.
O, per usare il tuo toString()
funzione leggermente diversa:
std::ofstream fout(
("file" + toString(step) + ".dat").c_str(),
std::ios );
0 per risposta № 2
La concatenazione delle stringhe non fa la formattazione, quindi devi farlo separatamente. Nel moderno C ++, hai to_string
e gli oggetti fstream accettano stringhe come argomenti del costruttore:
std::ifstream infile(std::string("file") + std::to_string(i) + ".dat");
Nelle vecchie versioni di C ++ si poteva usare stringstreams per boost = lexical_cast per formattare il numero intero in una stringa, e quindi usare il c_str()
funzione membro per ottenere un puntatore char fuori dalla stringa:
std::string filename; // populate somehow
std::ifstream infile(filename.c_str());