Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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();

}


Geschrieben

"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.

Geschrieben

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.

Geschrieben
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();

}


Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...