Scrhnd Geschrieben 22. Februar 2012 Geschrieben 22. Februar 2012 Hallo, ich habe eine Funktion geschrieben, die 2 Textdateien öffnet und guckt ob die Zeilen der ersten Textdatei in der zweiten vorhanden sind. Dafür muss ich den Dateizeiger in einer Datei wieder auf Anfang setzen, was aber irgendwie nicht klappen will. Ich hoffe jemand kann mir helfen. Mein Code sieht wie folgt aus. void vergleichen(char* dateiname, char* vergleichsdatei) { //Variablen deklarieren fstream datei1, datei2; streampos position = 0; string zeile1, zeile2; bool gefunden = false; //Dateien öffnen datei1.open(vergleichsdatei, ios::in); datei2.open(dateiname, ios::in); /*Die Schleife liest solange Zeilen in Datei1 ein und vergleicht sie mit jeder Zeile in Datei2 bis keine Zeilen mehr vorhanden sind*/ do{ getline(datei1, zeile1); //Hier der Versuch den Dateizeiger wieder auf den Anfang von Datei2 zu setzen position = datei2.tellg(); datei2.seekg(-position, ios::cur); /*Die momentan geladene Zeile aus Datei1 wird solange mit Zeilen aus Datei2 verglichen bis sie gefunden wurde, oder Datei2 EOF ist*/ do{ getline(datei2, zeile2); if(zeile1.compare(zeile2) == 0) { gefunden = true; break; } }while(!datei2.eof()); /*Wurde keine entsprechende Zeile in Datei2 nicht gefunden wird die aus Datei1 ausgegeben*/ if(!gefunden) cout<<zeile1<<endl<<"Zeile nicht vorhanden"<<endl<<endl; gefunden = false; }while(!datei1.eof()); //Dateien schließen datei1.close(); datei2.close(); } Zitieren
Klotzkopp Geschrieben 22. Februar 2012 Geschrieben 22. Februar 2012 "Will irgendwie nicht klappen" ist keine ausreichende Fehlerbeschreibung. Was mir aber auffällt: eof eignet sich nicht als Schleifenbedingung, weil es erst dann true liefert, wenn das Lesen schon einmal fehlgeschlagen ist. Benutz die Leseoperation selbst als Schleifenbedingung.Wenn du beim Lesen am Dateiende angekommen bist, musst du erst den Fehlerstatus zurücksetzen, bevor du damit weiterarbeiten kannst.Relative Positionierung (also seekg mit 2 Parametern) funktioniert nicht bei Textdateien.Die Verwendung von open/close ist in C++ unüblich, darum kümmern sich Konstruktor und Destruktor. Zitieren
Scrhnd Geschrieben 22. Februar 2012 Autor Geschrieben 22. Februar 2012 Der Fehler liegt darin, dass sobald die innere Schleife einmal komplett durchgelaufen ist, also Datei2 EOF erreicht hat nichts mehr in Zeile2 eingelesen wird. Ich versuche deine Ratschläge mal umzusetzen. Zitieren
Guybrush Threepwood Geschrieben 22. Februar 2012 Geschrieben 22. Februar 2012 Um den Zeiger wieder auf den Anfang zu setzten kannst du einfach seekg (0, ios::beg); machen Zitieren
Scrhnd Geschrieben 23. Februar 2012 Autor Geschrieben 23. Februar 2012 Um den Zeiger wieder auf den Anfang zu setzten kannst du einfach seekg (0, ios::beg); machen Das habe ich bereits ausprobiert. Das funktioniert nur wenn, die Datei noch nicht EOF ist. Ich habe mein Problem jetzt gelöst, allerdings auf eine etwas unschöne Art und Weise, da ich es leider nicht hinbekommen habe den Fehlerstatus zurückzusetzen. void vergleichen(char* dateiname, char* vergleichsdatei) { //Variablen deklarieren fstream datei1, datei2; streampos position = 0; string zeile1, zeile2; bool gefunden = false; //Dateien zum schreiben öffnen und das Dateiende signalisieren datei1.open(vergleichsdatei, ios::app); datei2.open(dateiname, ios::app); datei1<<"ENDE"<<endl; datei2<<"ENDE"<<endl; datei1.close(); datei2.close(); //Dateien zum Lesen öffnen datei1.open(vergleichsdatei, ios::in); datei2.open(dateiname, ios::in); /*Die Schleife liest solange Zeilen in Datei1 ein und vergleicht sie mit jeder Zeile in Datei2 bis keine Zeilen mehr vorhanden sind*/ do{ getline(datei1, zeile1); datei2.seekg(0, ios::beg); /*Die momentan geladene Zeile aus Datei1 wird solange mit Zeilen aus Datei2 verglichen bis sie gefunden wurde, oder Datei2 in der letzten Zeile angekommen ist*/ do{ getline(datei2, zeile2); if(zeile1.compare(zeile2) == 0) { gefunden = true; break; } }while(zeile2.compare("ENDE") != 0); /*Wurde keine entsprechende Zeile in Datei2 nicht gefunden wird Zeile1 ausgegeben*/ if(!gefunden) cout<<zeile1<<endl<<"Zeile nicht vorhanden"<<endl<<endl; gefunden = false; }while(zeile1.compare("ENDE") != 0); datei1.close(); datei2.close(); } Zitieren
Klotzkopp Geschrieben 23. Februar 2012 Geschrieben 23. Februar 2012 Kann es sein, dass du von C kommst? Verbesserungsvorschlag: void vergleichen(char* dateiname, char* vergleichsdatei) { ifstream datei1(dateiname); string zeile1; while(getline(datei1, zeile1)) { bool gefunden = false; ifstream datei2(vergleichsdatei); string zeile2; while(getline(datei2, zeile2)) { if(zeile1 == zeile2) { gefunden = true; break; } } if(!gefunden) cout<<zeile1<<"\nZeile nicht vorhanden\n\n"; } }[/code] Wenn die Dateien nicht riesengroß sind, könntest du sie auch komplett in den Speicher laden, dann musst du die Vergleichsdatei nicht mehrfach einlesen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.