Jasně že se ti přepíše - ten soubor neustále pojmenováváš. Tvůj přístup je správný - musíš k názvu souboru nakonec přidat číslo. V C++ nemůžeš jen tak přidávat čísla k řetězcům. Nejjednodušší postup je připravit si název souboru do stringu. Číslo do stringu dostaneš pomocí třídy stringstream.
Tolik k teorii. Osobně používám jednu fintu u třídy stringstream - její použití tříští kód, je hůře čitelný. Proto si již ze zásady vždy vtvořím hlavičkový soubor s následujícími operátory:
template <class Whatever>
string operator+(const string & a, const Whatever & b)
{
stringstream ss; ss << a << b; return ss.str();
}
template <class Whatever>
string & operator+=(string & a, const Whatever & b) {
stringstream ss; ss << a << b; a = ss.str(); return a;
}
Když mám takto nadefinované operátory, můžu napsat následující:
string nazevsouboru("soubor");
int i = 1;
nazevsouboru += i;
nazevsouboru += ".txt"
ofstream soubor(nazevsouboru.c_str());