Schleifenproblem
-
#include "class.h" int verwaltung::CreatIndex(){ int i = 0; fstream f_files1; f_files1.open( "files1.txt", fstream::in ); fstream f_files2; f_files2.open( "files2.txt", fstream::in ); fstream f_index; f_index.open( "Index.txt", fstream::out ); string s_vergleich1; string s_vergleich2; while ( !f_files1.eof() ){ getline( f_files1, s_vergleich1 ); while ( !f_files2.eof() ){ getline( f_files2, s_vergleich2 ); if ( ( i = s_vergleich2.compare(s_vergleich1) ) == 0 ){ f_index << s_vergleich1 << endl; } } f_files2.seekg ( 0, ios_base::beg ); } f_files1.close(); f_files2.close(); f_index.close(); return 0; }
files1:
a.txt b.txt c.txt d.txt e.txt f.txt g.txt h.txt i.txt j.txt k.txt l.txt m.txt n.txt o.txt p.txt z.txt
files2:
a.txt b.txt c.txt d.txt e.txt f.txt g.txt h.txt i.txt j.txt k.txt l.txt m.txt n.txt z.txt
index:
a.txt
Warum wird nach dem 1. Vergleich des 1. String in files1
mit dem 1. String des files2 kein weiterer Vergleich mehr gemacht?Meine Vermutung war, dass der f_files2 stream nach einmaligem Durchlaufen der
2. while schleife am Ende angelangt ist...
jedoch müsste dieser nach f_files2.seekg ( 0, ios_base::beg );
wieder am Anfang stehen.Wäre nett wenn mir jemand helfen könnte
-
Kurzer Nachtrag:
die Zeile 28 heißt,if ( s_vergleich2.compare(s_vergleich1) == 0 ){
-
Du hast recht mit deiner Vermutung, aber dein seekg steht hinter der Schleife die die erste Datei durchläuft.
Zu deinem Code:
Hat i irgendeinen Sinn? warum vergleichst du die Strings nicht mit "=="?Wenn du vor einer Leseoperation auf eof prüfst, bringt dir das herzlich wenig, wenn die folgende Leseoperation wegen eof scheitert und du dann trotzdem mit der Verarbeitung weitermachst. Schreib deine Schleifenköpfe lieber so:
while ( getline( f_files1, s_vergleich1 ) )
Gibt es Gründe, warum du die Dateien von Hand öffnest und schließt? Das kannst du doch den Konstruktor und Destruktor des fstreams automatisch machen lassen. Dann kann garantiert nichts schiefgehen, während ein versehentlich falsch eingesetztes open oder close zu merkwürdigem Verhalten führt.
Warum benutzt du fstream und nicht ifstream/ofstream?
-
SeppJ schrieb:
Du hast recht mit deiner Vermutung, aber dein seekg steht hinter der Schleife die die erste Datei durchläuft.
Das steht doch in der 1. while Schleife,
also nach der Schleife, die die 2. Datei durchläuft,
oder verstehe ich dich falsch?
-
O.o schrieb:
SeppJ schrieb:
Du hast recht mit deiner Vermutung, aber dein seekg steht hinter der Schleife die die erste Datei durchläuft.
Das steht doch in der 1. while Schleife,
also nach der Schleife, die die 2. Datei durchläuft,
oder verstehe ich dich falsch?Oh ,richtig. Deine Einrückung hat mich total durcheinandergebracht. Ich gucke mir das mal an. Ich habe oben noch ein paar Fragen/Anmerkungen an dich reineditiert, mit denen du dich inzwischen beschäftigen kannst.
-
Ich hab's: Nachdem das getline von Datei 2 am Dateiende fehlschlägt, ist der Stream in einem Fehlerzustand. Den musst du ersteinmal beseitigen mit clear(), bevor du wieder etwas mit dem Stream machen kannst.
-
SeppJ schrieb:
Ich habe oben noch ein paar Fragen/Anmerkungen an dich reineditiert, mit denen du dich inzwischen beschäftigen kannst.
Ok
-hat i irgendeinen Sinn?
i hatte noch einen Sinn, als ich mit .find() anstatt .compare
verglichen habe. Dies hat allerdings zu Problemen im Programmablauf geführt.-Gibt es Gründe, warum du die Dateien von Hand öffnest und schließt?
Der f_index.close() gehört eigentlich in eine
andere funktion und da habe ich es lieber, wenn ich sehe wo ich eine
File schließe^^-Schleifenköfpe
cool wusste ich nicht :p
-
SeppJ schrieb:
Ich hab's: Nachdem das getline von Datei 2 am Dateiende fehlschlägt, ist der Stream in einem Fehlerzustand. Den musst du ersteinmal beseitigen mit clear(), bevor du wieder etwas mit dem Stream machen kannst.
Echt super, vielen Dank!!!
-
mh aber mal so ne andere anmerkung_
wieso liest du die dateien nicht komplett ein(z.B. in nem std::vectorstd::string) und guckst dir dann diese gespeicherten daten an
so ist das doch mordslangsam weils immer auf die festplatte warten muss