seekg zeigt bei Dateizugriff nicht gewünschte Wirkung

nitgun

Mitglied
moin, moin,

ich versuche gerade ein Programm zu schreiben, welches seine Eingabedaten mit Hilfe einer Datei übermittelt bekommt. Dazu habe ich bereits einen kleinen Teil geschrieben. Leider komme ich mit dem Dateizugriff nicht so recht klar.
In diesem Programmstück lese ich erstmal alles Zeilen in der Datei ein, um zu wissen, wie viele Zeilen da drin stehen um beim eigentlichen Programmablauf dann eine Fortschrittsanzeige realisieren zu können (falls da jemand eine besser Idee hat, als die Datei erst komplett einzulesen, wäre ich dem nicht abgeneigt). Nach dem ich das gemacht habe, muss ich natürlich wieder an den Dateianfang, um jetzt ernsthaft die Daten zu lesen. Das sollte ja prinzipiell mit seekg funktionieren. Leide kann ich aber die Daten kein zweites Mal auslesen. Um Fehler beim zweiten Auslesen auszuschließen, habe ich einfach nach der Zeile mit seekg noch einmal den funktionierenden Code für das Zeilenzählen eingefügt.
Vielleicht könnt ihr mir helfen, was ich hier falsch mache. Vielen Dank schon mal für die Hilfe im Voraus.

Code:
#include <iostream>         //allgemeiner Header für Ein- und Ausgabe
#include <fstream>          //Header für Dateizugriffe
#include <string>

using namespace std;

//HAUPTFUNKTION
int main(int argc, char* argv[])
{
    if (argc==1) {                                    //Abbruch des Programms, wenn kein Dateiname angegeben worden ist
                 cout<<"Es wurde kein Dateiname angegeben\n";
                 return 0;
    }
    
    ifstream alleStrukturen(argv[1]);                 //Ausgangsdatei öffnen
    if (!alleStrukturen) {                            //Fehlerabfrage
       cerr<<"Datei kann nicht geöffnet werden\n";
       exit(-1);
    }
    char buffer[256];                                 //Puffervariable für eingelesene Zeichen
    int AnzahlStrukturen=0;                           //Anzahl der Strukturen, die sich in der Ausgangsdatei befinden
    while (alleStrukturen.getline(buffer,256)) AnzahlStrukturen++;           //zählen der Strukturen
    cout<<AnzahlStrukturen<<" Strukturen wurden eingelesen\n";
    
    alleStrukturen.seekg(static_cast<streamoff>(0),ios::beg);               //Lesepointer nach dem Zählen wieder auf den Anfang der Datei setzen
        
    AnzahlStrukturen=0;                               //Anzahl der Strukturen, die sich in der Ausgangsdatei befinden
    while (alleStrukturen.getline(buffer,256)) AnzahlStrukturen++;           //zählen der Strukturen
    cout<<AnzahlStrukturen<<" Strukturen wurden beim 2. Mal eingelesen\n";        
        
    alleStrukturen.close();                           //Schließen der Ausgangsdatei
    alleStrukturen.clear();
    system("PAUSE");
}
 
Hallo.
Das hatte ich auch schon mal. Ich stellte fest, dass nach Erreichen des "End of Files" irgendein Bit im Eingabestrom gesetzt wurde, welches alle weiteren Aktionen sinnlos machte. Bei mir hat ifstream::clear() und dann ifstream::seekg(...) geholfen. clear() setzt alles Stream-Bits wieder zurück.

Grüße
OS
 
Vielen Dank. Das hilft wirklich weiter. Nach meinem Lesen hatte ich mir soetwas in der Art schon gedacht, aber das clear dummerweise nach dem seekg eingefügt. Das brachte nichts. Wenn man es allerdings davor einfügt, wirkt es Wunder.

mfg

nitgun
 

Neue Beiträge

Zurück