+ Antworten
Ergebnis 1 bis 6 von 6

Dateizeiger in Stream positionieren

Diskussion über Dateizeiger in Stream positionieren in C++: Compiler, IDEs, APIs der Kategorie Programmierung; Hallo, ich habe eine Funktion geschrieben, die 2 Textdateien öffnet und guckt ob die Zeilen der ersten Textdatei in der ...

  1. #1
    Reg.-Benutzer
    Reg.-Datum
    22.02.2012
    Beiträge
    3

    Standard Dateizeiger in Stream positionieren

    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.

    Code:
    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();
    }

  2. #2
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    "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.
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  3. #3
    Reg.-Benutzer
    Reg.-Datum
    22.02.2012
    Beiträge
    3

    Standard

    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.

  4. #4
    Moderator Daily Talk Avatar von Guybrush Threepwood
    Reg.-Datum
    01.09.2002
    Ort
    Melee Island
    Beiträge
    4.413

    Standard

    Um den Zeiger wieder auf den Anfang zu setzten kannst du einfach seekg (0, ios::beg); machen
    Ich bin Guybrush Threepwood, ein mächtiger Pirat!

  5. #5
    Reg.-Benutzer
    Reg.-Datum
    22.02.2012
    Beiträge
    3

    Standard

    Zitat Zitat von Guybrush Threepwood Beitrag anzeigen
    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.

    Code:
    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();
    }

  6. #6
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    Kann es sein, dass du von C kommst?

    Verbesserungsvorschlag:
    Code:
    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";
    	}
    }
    Wenn die Dateien nicht riesengroß sind, könntest du sie auch komplett in den Speicher laden, dann musst du die Vergleichsdatei nicht mehrfach einlesen.
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Ähnliche Themen

  1. JLabel positionieren
    Von elSusto im Forum Java
    Antworten: 5
    Letzter Beitrag: 28.04.2009, 10:52
  2. VB.net - Positionieren von Desktopicons
    Von Faultier im Forum .NET
    Antworten: 2
    Letzter Beitrag: 11.01.2007, 08:18
  3. CSS; Elemente Positionieren
    Von halimeh im Forum Webdesign
    Antworten: 3
    Letzter Beitrag: 28.04.2005, 17:21
  4. Dateizeiger
    Von flipstar0711 im Forum Java
    Antworten: 8
    Letzter Beitrag: 06.06.2002, 09:57
  5. Bilder mit CSS positionieren
    Von matthias.brehm im Forum Webdesign
    Antworten: 1
    Letzter Beitrag: 17.06.2001, 15:47

Die häufigsten Suchbegriffe für diese Seite:

fstream dateizeiger setzen