problem mit ifstream
-
MFK schrieb:
vlad_tepesch schrieb:
Naja, ich habe genau oben geposteten Code in eine leere main gepackt.
das 2. while überspringt er komplett.Auch mit einem file.clear() zwischen close und open?
ja.
auch wenns nach dem Open gemacht wird -> keine Auswirkung.
-
Also was ich ausprobiert habe, sah jetzt so aus:
int main(int argc, char* argv[]) { std::ifstream file; file.open("test.txt"); std::string line; while( std::getline(file, line) ) { std::cout << line << '\n'; } file.close(); std::cout << '\n'; file.open("test.txt"); while( getline(file, line) ) { std::cout << line << '\n'; } file.close(); return 0; }
... und rattert mir wie erwartet zweimal die Datei auf die Konsole.
-
Ah, ok.
**
Das clear löst das Problem doch.**Ich hatte erst im Testprogramm vergessen, im 2. open einen gültigen Pfad anzugeben und danach das zwischenzeitlich eingefügte seek zu entfernen, dass ich auch noch vor dem open eingefügt hatte.
Danke Leute!
edit:
aber ohne das clear gehts wirklich nicht.
-
Möge der Stream mit uns sein!
-
Mögen die Leute endlich lernen, dass Streams RAII können. Ist ja schrecklich.
-
PiOhneKomma: Nun nicht so hart sein, das war sein runtergestripptes Beispiel, dass wohl bei n Durchläufen zumindest mal die File-Pointer-Position als Zustand mitschleift oder so ähnlich, wir haben ja gar nicht so genau gesehen, was er nun dort tut. Sicherlich ginge das natürlich auch mit RAII und nem auto_ptr auf dem Heap
-
Wozu nen auto_ptr?
-
Na um bloß keine Leaks zu bekommen!
-
Wo willst du denn da Leaks bekommen?
-
Löschen bitte.
-
Na auf dem Heap!
-
Ich sehe keine Heap-Allokationen.
-
314159265358979 schrieb:
Wo willst du denn da Leaks bekommen?
Wenn du mal nicht nur auf deine reflexauslösenden Schlüsselwörter reagieren, sondern den Thread auch mal genau lesen würdest, würdest du sehen, dass man hier für RAII einen Smartpointer braucht.
-
Du hast Recht, habe mir nur den Code im Thread angesehen. Sorry.
-
314159265358979 schrieb:
Mögen die Leute endlich lernen, dass Streams RAII können. Ist ja schrecklich.
was ist damit gemeint?
was hat das mit meinem Problem zu tun?wenn damit gemeint ist, dass ich einen Stream auch nur für eine Datei benutzten sollte, dürfte die Klasse kein open und close anbieten.
-
vlad_tepesch schrieb:
314159265358979 schrieb:
Mögen die Leute endlich lernen, dass Streams RAII können. Ist ja schrecklich.
was ist damit gemeint?
was hat das mit meinem Problem zu tun?wenn damit gemeint ist, dass ich einen Stream auch nur für eine Datei benutzten sollte, dürfte die Klasse kein open und close anbieten.
Ich finde auch, Du solltest open und close gar nicht benutzen.
Um die Stream-Variable lokaler zu machen, setze ich einen eigenen Block.
-
Hab ich das jetzt richtig verstanden und man solte es so machen?
int main() { { std::ifstream file("test.txt"); std::string line; while( std::getline(file, line) ) { std::cout << line << '\n'; } std::cout << '\n'; } { std::ifstream file("test.txt"); std::string line; while( std::getline(file, line) ) { std::cout << line << '\n'; } std::cout << '\n'; } return 0; }
-
Du hast Volkard teilweise richtig verstanden, allerdings sagte er nicht, dass "man" es so tun sollte, sondern nur, dass er es so macht.
-
Upps, das hab ich irgendwie überlesen. Mann, ich lese man eigentlich überall. Doofes Wort.
Aber wieso meint volkard denn eigentlich, Stream Variablen so lokal wie möglich zu halten und auf open() bspw. close() zu verzichten?
-
Ich für meinen Teil tue sowas, weil das unabhängige Verwenden ein und desselben Objekts immer dazu führt, dass man an mehreren Stellen etwas anpassen muss, nur weil man an einer Stelle etwas verändert. Und man sieht die Unabhängigkeit auch viel besser Ich denke nicht einmal, dass es hier ansonsten irgendeinen technischen Vorteil gäbe.