Zeilenanzahl aus Textdokument ermittlen



  • Hallo Leute

    Ich bräuchte einen Befehl, um die Zeilenanzahl in einem Textdokument zu ermitteln.
    Also ich habe eine Datei mit n Zeilen und brauche den Wert von n...

    Vielen Dank
    JanK411



  • Also musst du einfach zählen, wie oft '\n' im File vorkommt.



  • danke für die schnelle antwort

    und das mache ich wie??
    ich bin noch ein relativer neuling 😃


  • Mod

    Du gehst zeichenweise durch das Dokument (get) und zählst mit. Denk dran, dass auch ein (nicht-leeres) Dokument ganz ohne Zeilenumbruch trotzdem noch eine Zeile hat. Wenn du es schön mit Zuckerguss haben willst, denkst du auch da dran, dass, wenn das letzte Zeichen ein Zeilenumbruch ist, dies nicht wirklich als eine richtige neue Zeile gilt.

    Bitte versuch das mal selber umzusetzen, anstatt hier auf eine Komplettlösung zu warten. Falls du konkrete fragen hast, frag noch einmal. Aber das tut dir sicherlich gut, wenn du deine Aufgaben selber löst und dir hier nur einen Wink in die richtige Richtung holst.



  • Hallo JanK411,

    in C++ gibt es einen Algorithmus std::count, der in einem Intervall aus zwei Iteratoren das Vorkommen eines Elements - in diesem Fall des Zeichens '\n' (alias LF) - zählt.
    Als Iteratoren wählt man dann z.B. den istreambuf-Iterator und übergibt ihm den istream auf das vorher geöffnete Dokument. Etwa so:

    #include <fstream>
    #include <iostream>
    #include <algorithm>
    
    int main()
    {
        using namespace std;
        ifstream textdocument("input.txt");
        if( !textdocument.is_open() )
        {
            cerr << "Fehler beim Oeffnen des Dokuments" << endl;
            return -2;
        }
        cout << "Das Dokument enthaelt " << count( istreambuf_iterator< char >( textdocument ), istreambuf_iterator< char >(), '\n' ) << " Zeilen" << endl;
        return 0;
    }
    

    Gruß
    Werner



  • Werner Salomon schrieb:

    Hallo JanK411,

    in C++ gibt es einen Algorithmus std::count, der in einem Intervall aus zwei Iteratoren das Vorkommen eines Elements - in diesem Fall des Zeichens '\n' (alias LF) - zählt.
    Als Iteratoren wählt man dann z.B. den istreambuf-Iterator und übergibt ihm den istream auf das vorher geöffnete Dokument. Etwa so:

    #include <fstream>
    #include <iostream>
    #include <algorithm>
    
    int main()
    {
        using namespace std;
        ifstream textdocument("input.txt");
        if( !textdocument.is_open() )
        {
            cerr << "Fehler beim Oeffnen des Dokuments" << endl;
            return -2;
        }
        cout << "Das Dokument enthaelt " << count( istreambuf_iterator< char >( textdocument ), istreambuf_iterator< char >(), '\n' ) << " Zeilen" << endl;
        return 0;
    }
    

    Gruß
    Werner

    Hallo Werner, ich gehe jetzt einfach mal davon aus, daß das funktioniert.

    Meine Frage wäre jetzt, wieso

    istreambuf_iterator< char >()
    

    ein gültiger

    InputIterator last
    

    ist.

    Danke.



  • SeppJ schrieb:

    Denk dran, dass auch ein (nicht-leeres) Dokument ganz ohne Zeilenumbruch trotzdem noch eine Zeile hat.

    Da \n ein Terminator ist, wuerde ich eine solche Zeile nicht mitzaehlen, oder das Dokument als ungueltig werten.



  • EOP, weil man ihn dereferenzieren, inkrementieren und vergleichen kann.

    Oder meinst du weniger wieso es kompiliert als wieso es funktioniert?

    Übrigens hätte ich

    count( istream_iterator<char>( textdocument ), istream_iterator<char>(), '\n' )
    

    genommen, ist da ein relevanter Performance-Unterschied, Werner?



  • EOP schrieb:

    Meine Frage wäre jetzt, wieso

    istreambuf_iterator< char >()
    

    ein gültiger

    InputIterator last
    

    ist.

    istreambuf_iterator

    cplusplus.com schrieb:

    The default constructor constructs an end-of-stream iterator

    So let it be written, so let it be done.

    Sone schrieb:

    EOP, weil man ihn dereferenzieren, inkrementieren und vergleichen kann.

    Sehr sinnvoll...



  • Sone schrieb:

    Übrigens hätte ich

    count( istream_iterator<char>( textdocument ), istream_iterator<char>(), '\n' )
    

    genommen, ist da ein relevanter Performance-Unterschied, Werner?

    Einerseits das, andererseits liefert deine Variante ein falsches Resultat.



  • @Swordfish: Das hatte ich überlesen. Danke.



  • Kellerautomat schrieb:

    SeppJ schrieb:

    Denk dran, dass auch ein (nicht-leeres) Dokument ganz ohne Zeilenumbruch trotzdem noch eine Zeile hat.

    Da \n ein Terminator ist, wuerde ich eine solche Zeile nicht mitzaehlen, oder das Dokument als ungueltig werten.

    Dann würdest du nen ziemlichen Blödsinn machen.
    Jeder Text-Editor macht dir so eine Datei problemlos auf, und alle die ich kenne können sie auch so speichern.



  • SeppJ schrieb:

    Wenn du es schön mit Zuckerguss haben willst, denkst du auch da dran, dass, wenn das letzte Zeichen ein Zeilenumbruch ist, dies nicht wirklich als eine richtige neue Zeile gilt.

    Also die Text-Editoren die ich so kenne sehen das anders 😉



  • Sone schrieb:

    EOP, weil man ihn dereferenzieren, inkrementieren und vergleichen kann.

    Oder meinst du weniger wieso es kompiliert als wieso es funktioniert?

    Übrigens hätte ich

    count( istream_iterator<char>( textdocument ), istream_iterator<char>(), '\n' )
    

    genommen, ist da ein relevanter Performance-Unterschied, Werner?

    Wenn du nicht das Whitespace-Skipping abstellst, zählt der istream_iterator überhaupt keine newlines, da das für ihn Whitespaces sind.



  • JanK411 schrieb:

    Hallo Leute

    Ich bräuchte einen Befehl, um die Zeilenanzahl in einem Textdokument zu ermitteln.
    Also ich habe eine Datei mit n Zeilen und brauche den Wert von n...

    Vielen Dank
    JanK411

    Mit getline die Datei zeilenweise einlesen und die Zeilen zählen?



  • Na toll... da hätt ich ja auch selbst drauf kommen können
    Das Auslesen ist ja sogar in ner schleife
    dann brauch ich ja nur die Variable zur erhöhen --> n++

    *kopfgegendiewandschlag*

    Trotzdem danke an euch alle

    JanK411


Anmelden zum Antworten