ifstream::seekg() funktioniert nicht



  • Ich lese den Inhalt der Datei aus und gebe alles in der Konsole wieder. Wenn ich das Ganze ein zweites mal mache, muss der Lese-Zeiger der ifstream-Klasse wieder auf den Anfang der Datei zeigen, was ja mit

    seekg(0) oder mit
    seekg(0,ios_base::beg);

    bewerkstelligt wird. Es funktioniert aber nicht.

    Der Code sieht bisher so aus:

    void f(ifstream& datei) {
    	char ch;
    	while(datei.get(ch))
    		cout.put(ch);
    
    	datei.seekg(0); //funktioniert nicht, der Inhalt wird durch die obige whileschleife
    	//nur einmal ausgegeben
    
    	while(datei.get(ch))
    		cout.put(ch);
    }
    

    Woran liegt denn das bloss?



  • Hi,

    Es ist so das ifstream in einem Fehlzustand ist -> EOF
    und daher wird das nicht funktionieren

    Probiers mal so:

    void f(ifstream& datei) 
    {
        while(!datei.eof())
            cout.put(datei.get());
    
        datei.seekg(0); 
    
        while(!datei.eof())
            cout.put(datei.get());
    }
    


  • Hmm... Es wird jetzt zwar eine Leerzeile weniger ausgegeben 😕 , aber ausgegeben wird immer noch einmal.



  • Um es nicht zum Fehlerzustand kommen zulassen, habe ich das ausprobiert, geht aber auch nicht. 😞

    void f(ifstream& datei) {
        while(datei.peek()!=EOF)
            cout.put(datei.get());
    
        datei.seekg(0);
    
        while(datei.peek()!=EOF)
            cout.put(datei.get());
    }
    


  • keinname schrieb:

    Um es nicht zum Fehlerzustand kommen zulassen, habe ich das ausprobiert, geht aber auch nicht. 😞

    void f(ifstream& datei) {
        while(datei.peek()!=EOF)
            cout.put(datei.get());
       
        datei.seekg(0);
    
        while(datei.peek()!=EOF)
            cout.put(datei.get());
    }
    

    Kann auch nicht gehen. Das eof-bit wird erst gesetzt *nachdem* eof gelesen wurde. Deshalb, und das schreibe ich hier jede Woche mindestens 10 Mal, ist der Test auf eof im Kopf einer Schleife in der Regel auch käse.

    void f(ifstream& datei) 
    {
        for(char c; datei.get(c);)
           cout.put(c);
    
        datei.clear();
        datei.seekg(0);
        for (char c; datei.get(c);)
            cout.put(c);
    }
    


  • Herzlichen Dank! Jetzt läuft es endlich. 😃


Anmelden zum Antworten