Zeilenzahl einer Datei/streams ermitteln



  • Hallo zusammen,

    ich würd gerne die Zeilenzahl eines Streams ermitteln, damit ich eine "Fortschrittsanzeige" machen kann wie weit die Bearbeitung gerade ist. Kleiner Democode:

    int main(){
      ifstream input("eineDatei.txt");
      int lineCount = getLineCount(input);
      string line;
      int progress = 0;  
    
      while(!input.eof()){ 
         line = getline(input, temp);
    
         cout << "Bearbeite Zeile: " << line << " / " << lineCount << endl;
         //führe operationen aus
    
    }
    
    int getLineCount(istream &istr){
    int i;string temp;
    while(!istr.eof()){
      getline(istr,temp);
      i++;
    }
    return i;
    }
    

    Das Problem ist dass der Stream nach Aufruf der Methode "ungültig" ist weil ich den wohl bis zum Ende gelaufen bin. Auch ein istr.seekp(0,ios::beg) am Ende der Methode bewirkt leider nichts 😞
    Irgendwelche Ratschläge ??

    P.S: Den Code hab ich eben aus dem Kopf zusammengeschrieben, also falls das irgendwas syntaktisch nicht ok ist, einfach drüber hinwegsehen..hab das Original nicht hier



  • Der Stream ist ungültig, weil noch das eof-Flag gesetzt ist.
    Das kannst du mit der Methode clear entfernen.
    Dann musst du natürlich noch mit seekg wieder an den Anfang gehen.





  • ok. werde es gleich mal ausprobieren ..kleine frage noch..ist das ermitteln der zeilenzahl mit getline() effizient ? oder gibts dafür ne funktion die "besser" geeignet ist ?



  • Da Zeilen keine festen Datensätze sondern dynamische Gebilde sind, gibt es garkeine "effiziente" Lösung für dieses Problem. Ich denke mal die einzige Optimierung die man hier noch großartig anbringen könnte wäre, die einzelnen Zeilen nicht herumzukopieren sondern nur die Zeilenende-Zeichen zu zählen.



  • Effizient ist es imho auf keinen Fall, da bei jedem Aufruf tatsächlich kopiert wird und du quasi dasselbe nochmal machst. Vielleicht wäre es sinniger, von der Zeichen- anstatt der Zeilenanzahl auszugehen. Diese hast du nämlich über Dateigrößenabfragen o.ä. deutlich leichter zur Verfügung.


Anmelden zum Antworten