Viele Textdateien einlesen
-
Vergiss den Mist, sorry, dumme Idee von mir. *peinlich*
#include <string> std::string file = "textdatei"; std::string tmp; for(int i = 0; i < 70; i++) { tmp = (file + (char) i + '0') + ".txt"; // Int in Char konvertieren und an string anhängen; ifstream stream(tmp.c_str()); // usw... }
-
Ad aCTa schrieb:
Vergiss den Mist, sorry, dumme Idee von mir. *peinlich*
tmp = (file + (char) i + '0') + ".txt"; // Int in Char konvertieren und anDie finde ich aber auch nicht besser, du wandelst das int in ein Char um, das is zwar schön und gut, aber bringt dir nichts weil du ja keine Zahl erhälst sondern das ascii Zeichen an das du noch, warum auch immer, ne 0 klebst. Wenn i 69 ist landet dann ein "E0" an der Position wo die Zahl sein sollte.
Ich mache das ganze bei solchen Sachen immer so:
char buffer[256]; for(int i=0;i<70;++i) { ZeroMemory(buffer,sizeof(char)*256); sprintf(buffer,"filename%d.txt",i); //hier fstream etc };
-
Xebov schrieb:
Die finde ich aber auch nicht besser, [...]
Stimmt. Da ist
char buffer[256]; ZeroMemory(buffer,sizeof(char)*256); sprintf(buffer,"filename%d.txt",i);hingegen gleich viel schöner.

In C++ nimmt man für lexikografische Umwandlungen normalerweise
std::stringstream. Keine Ahnung, wieso hier immer wieder umständliche, nicht standardkonforme und fehleranfällige Lösungen empfohlen werden. Finn, schau mal auf www.cplusplus.com für mehr Informationen, oder lies den FAQ-Beitrag "Einmal Zahl nach String und zurück".
-
Nexus schrieb:
hingegen gleich viel schöner.

Es ist ne Lösung die Funktioniert und einfach ist, ob sie schön ist spielt dabei für mich nur ne untergeordnette Rolle.
Nexus schrieb:
In C++ nimmt man für lexikografische Umwandlungen normalerweise
std::stringstream. Keine Ahnung, wieso hier immer wieder umständliche, nicht standardkonforme und fehleranfällige Lösungen empfohlen werden.Was is an meiner Lösungsmöglichkeit bitte Umständlich, die Funktionen sind nunmal da und sehr einfach zu nutzen.
-
Nexus schrieb:
Xebov schrieb:
Die finde ich aber auch nicht besser, [...]
Stimmt. Da ist
char buffer[256]; ZeroMemory(buffer,sizeof(char)*256); sprintf(buffer,"filename%d.txt",i);hingegen gleich viel schöner.

Ja, ist es. Ca. 1 Mio. mal.

-
Xebov schrieb:
Nexus schrieb:
hingegen gleich viel schöner.

Es ist ne Lösung die Funktioniert und einfach ist, ob sie schön ist spielt dabei für mich nur ne untergeordnette Rolle.
Nexus schrieb:
In C++ nimmt man für lexikografische Umwandlungen normalerweise
std::stringstream. Keine Ahnung, wieso hier immer wieder umständliche, nicht standardkonforme und fehleranfällige Lösungen empfohlen werden.Was is an meiner Lösungsmöglichkeit bitte Umständlich, die Funktionen sind nunmal da und sehr einfach zu nutzen.
Nur weil sie einfach zu nutzen sind, sollte man sie nicht immer benutzen wenn es bessere wege gibt. Die WinAPI ist nun mal hässlich, und gehört nicht zum std, du befindest dich in dem C++ unterforum, nicht WinAPI.
-
for(unsigned long long i = 0; i < 70; ++i) { std::stringstream str; str << "filename" << i << ".txt"; fstream in(str.str().c_str()); // ... }ok, sicher nicht viel hübscher. Aber wenigstens weniger fehleranfällig. In C++0x schaut das ganze dann wohl so aus
for(unsigned long long i = 0; i < 70; ++i) { fstream in("filename" + std::to_string(i) + ".txt"); // ... }Xebov schrieb:
Nexus schrieb:
hingegen gleich viel schöner.

Es ist ne Lösung die Funktioniert und einfach ist, ob sie schön ist spielt dabei für mich nur ne untergeordnette Rolle.
So denkt man nur, bis man einmal fremden Code warten muss oder wie sagt man so schön: Wenn man Code schreibt, sollte man immer so tun, als sei die Person, die den Code warten muss, ein Verrückter mit einer Waffe.
Xebov schrieb:
Nexus schrieb:
In C++ nimmt man für lexikografische Umwandlungen normalerweise
std::stringstream. Keine Ahnung, wieso hier immer wieder umständliche, nicht standardkonforme und fehleranfällige Lösungen empfohlen werden.Was is an meiner Lösungsmöglichkeit bitte Umständlich, die Funktionen sind nunmal da und sehr einfach zu nutzen.
sizeof(char) ist unnötig, ZeroMemory ist unnötig (und müsste man ja erst noch schreiben), sprintf ist nicht schön zu benutzen.
-
rüdiger schrieb:
So denkt man nur, bis man einmal fremden Code warten muss oder wie sagt man so schön: Wenn man Code schreibt, sollte man immer so tun, als sei die Person, die den Code warten muss, ein Verrückter mit einer Waffe.
Aber wennd er verrückte Programmeiren kann darf ich doch wohl davon ausgehen das er ne einfache WINAPI Funktion kennt und ihm sprintf auch bekannt ist.
rüdiger schrieb:
sizeof(char) ist unnötig, ZeroMemory ist unnötig (und müsste man ja erst noch schreiben), sprintf ist nicht schön zu benutzen.
Das das sizeof(char) unnötig ist weiß ich, ich schreib es trotzdem einheitlich mit rein bei mir, ZeroMemory aus der WINAPI, wenn das jemand nicht kennt kann er die Funktion ja einfach bei google mal suchen dann weiß derjenige auch bescheid, und was sprintf angeht so schlimm ist die Funktion ja nicht. Unterm Strich ist es sowieso nur eine Mögliche Lösung, deine fidne ich auch nicht schlecht, zumal die im Gegensatz zu der ganz oben wenigstens Funktioniert.
-
ZeroMemory aus der WINAPI, wenn das jemand nicht kennt kann er die Funktion ja einfach bei google mal suchen dann weiß derjenige auch bescheid
aber...aber...aber...ich programmiere unter Linux *schnief*
-
sprintf ist nicht schön zu benutzen.
Naja also ich finde, man kanns auch übertreiben...
Viel schlimmer als die stringstream-Variante ist es nicht. Ich weiß dass viele hier bei dem "<<" Operator immer gleich ganz feucht werden, aber dennoch muss man sprintf und Konsorten deswegen nicht unbedingt verteufeln.
-
> Die finde ich aber auch nicht besser, du wandelst das int in ein Char um, das is zwar schön und gut, aber bringt dir nichts weil du ja keine Zahl erhälst sondern das ascii Zeichen an das du noch, warum auch immer, ne 0 klebst.
Mein Code hatte nur einen kleinen Fehler, es fehlte ein Klammerpaar:
tmp = (str + (char) (i + '0')) + ".txt";Was das + '0' bringt?
i = 5;
'0' = 48
48 + 5 = 63.
(char) 63 = '5'

Ich gebe gerne zu, dass dies keine schöne Lösung ist, aber besser als deine, sie ist plattformunabhängig und hat keinen WinAPI-Dreck drin :P, obwohl meine Lösung mehr Stil von "C mit Klassen" hat.
Trotzdem, stringstream rules!
-
stringstream rules!
, weil ?
Ich benutze es auch, einfach deswegen weil es irgendwie "besser" aussieht. Aber irgendwelche wieauchimmer gearteten technischen Vorteile sehe ich nicht. Ich lass mich natürlich gern eines besseren belehren.
-
So, ich logg mich erst mal wieder ein...
*log in*
Okay, wieso stringstream besser ist?
Es bringt recht viele Funktionalitäten mit, schön in einer Klasse gekapselt und 100%tig sicher. sprintf() hingegen funktioniert zwar auch, du musst aber dann wirklich dich um alles selber kümmern, aufpassen wegen Überläufen etc. Da viele Anfänger damit aber Probleme haben, sollten sie lieber sichere Lösungen bevorzugen.Außerdem, wieso C nehmen, wenn man C++ hat? Es ist ja auch eine Stilfrage, aber alles, was C++ bietet, sollte man nutzen, sonst kann man gleich C nehmen.
Ich war einfach zu faul mich in C++ reinzudenken gestern abend, kam net auf stringstream. Um den Code in C++ umzuwandeln, einfach statt (char) static_cast<char> nehmen und fertig ist die dreckige C++-Lösung.

-
rüdiger schrieb:
...
Xebov schrieb:
Nexus schrieb:
hingegen gleich viel schöner.

Es ist ne Lösung die Funktioniert und einfach ist, ob sie schön ist spielt dabei für mich nur ne untergeordnette Rolle.
So denkt man nur, bis man einmal fremden Code warten muss oder wie sagt man so schön: Wenn man Code schreibt, sollte man immer so tun, als sei die Person, die den Code warten muss, ein Verrückter mit einer Waffe....
Stimme Dir vollkommen zu ... besonders bedenken sollte man, dass man oftmals selbst dieser arme Wicht ist, der ein Jahr später über dem eigenen Code brütet und sich verzweifelt fragt, was denn bitte damit gemeint gewesen ist und ob dieser und jener Seiteneffekt wirklich beabsichtigt war.
Gruß,
Simon2.
-
Danke Leute! Ich probiers nachher gleich mal aus

-
Ad aCTa (offline) schrieb:
Was das + '0' bringt?
i = 5;
'0' = 48
48 + 5 = 63.
(char) 63 = '5'

und 69 + '0' ist was? :p
Xebov schrieb:
rüdiger schrieb:
So denkt man nur, bis man einmal fremden Code warten muss oder wie sagt man so schön: Wenn man Code schreibt, sollte man immer so tun, als sei die Person, die den Code warten muss, ein Verrückter mit einer Waffe.
Aber wennd er verrückte Programmeiren kann darf ich doch wohl davon ausgehen das er ne einfache WINAPI Funktion kennt und ihm sprintf auch bekannt ist.
WinAPI Funktionen haben hier nichts verloren, vor allem wenn sie ohnehin überflüssig sind und selbst wenn sie nicht überflüssig wären, durch ein standard konformes Konstrukt ersetzt werden könnten.
-
> und 69 + '0' ist was?
Das ist ein 'u'. Für zweistellige Sachen muss man eben string((char) (6 + '0')) + string((char) (9 + '0')) machen.
Naja, ich habe nie behauptet, das sei eine schöne Lösung.