/ / Enumerazione dei nomi di file in c ++ - c ++

Enumerazione dei nomi di file in c ++ - c ++

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 № 1

Una 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_stringe 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());