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
-
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ß
WernerHallo 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.
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
JanK411Mit 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