Ein ofstream, mehrere Dateien
-
Ich möchte mithilfe eines Ofstreams eine Textdatei öffnen und was reinschreiben, das ganze aber mehrmals. Also den gleichen Text in mehrere verschiedene Dateien schreiben, die aber alle ganz bestimmte Namen haben sollen. Ich dachte sowas geht:
void create(string name){ ofstream macro; macro.open(name); //hier liegt der Hase im Pfeffer... macro << "hier kommt dann der Text rein, das ist ne Menge" macro.close; } int main() { string name1="irgendwas.txt",name2="nochwas.txt",name3="nochmehr.txt"; create(name1); create(name2); create(name3); return 0; }aber dann meckert er rum:
d:\Visual Studio Projekte\Berechnungen\weaving\macro.cpp(19): error C2664: 'void std::basic_ofstream<_Elem,_Traits>::open(const char *,std::_Iosb<_Dummy>::openmode,int)': Konvertierung des Parameters 1 von 'std::string' in 'const char *' nicht möglich
with
[
_Elem=char,
_Traits=std::char_traits<char>,
_Dummy=int
]
D.h. er kann in der Zeile macro.open(name) nichts mit dem String name anfangen. Das verwundert mich aber sehr, denn wenn ich da statt name z.b. "irgendwas" reinschreiben würde, wäre das doch genauso ein string oder???
Wenn mir jmd auf die Sprünge helfen könnte, wär das nett
Die Notvariante wäre ja, das ganze eben dreimal aufzuschreiben und jedesmal den richtigen Namen einzugeben, aber ich bin sicher, dass es eine elegantere Lösung gibt
-
Du musst einen char const * übergeben, den bekommst du bei std::string durch die Methode c_str()
void create(string name){ ofstream macro; macro.open(name.c_str()); // <- so geht es macro << "hier kommt dann der Text rein, das ist ne Menge" }Achja das .close() kannst du weg lassen da die datei bei der zerstörung des objektes macro automatisch geschlossen wird.

-
Ich liebe dieses Forum.Vor der Frühstückspause gefragt, wenn ich weitermache ist die Antwort da. Ich geh mal davon aus, dass es so funktioniert, und bedanke mich schonmal

( Edit: wie schon vermutet, es funktioniert alles wunderbar( ich hoffe ich kann mir das merken ))
-
Du könntest das ganze auch etwas "eleganter" machen.
void create(string name) { ofstream macro; macro.open(name.c_str()); macro << "hier kommt dann der Text rein, das ist ne Menge"; } int main() { string filenames[] = { "test1.txt","test2.txt","test3.txt" }; for(size_t i = 0; i < sizeof(filenames) / sizeof(string); ++i) create(filenames[i]); return 0; }
-
@evilissimo: Stimmt, gefällt mir sehr gut. Soweit hatte ich noch gar nicht gedacht, ist aber gleich aus mehrern Gründen praktisch, und übersichtlicher. Werd ich noch einbauen, dann kann ich das ganze auf beliebige viele Files erweitern

-
Ich habe da für solche Fälle einen eigenen Stream. Der schreibt die Ausgaben automatisch in 2 Ziele. Kombiniert man den mit sich selbst, dann geht das auch über mehrere. Der geht so:
std::ofstream file1("test1.txt"); std::ofstream file2("test2.txt"); std::ofstream file3("test3.txt"); cxxtools::Tee t1(file1, file2); // leite Ausgaben nach t1 in file1 und file2 cxxtools::Tee t(t1, file3); // leite Ausgaben nach t in t1 und file3 t << "hier kommt dann der Text rein, das ist ne Menge";Du findest die Bibliothek unter http://www.tntnet.org/cxxtools.bhtm. Ich verwende das unter Linux, aber die Tee-Klasse ist auf jeden Fall plattformunabhängig.
Gruß
Tommi