2013-10-02 14 views
5

Gibt es eine Funktion, die ich verwenden kann, um die gesamte Dateizeilennummer in C++ zu erhalten, oder muss es manuell von for Schleife durchgeführt werden?C++ Get Total File Zeilennummer

#include <iostream> 
#include <ifstream> 

ifstream aFile ("text.txt"); 
if (aFile.good()) { 
//how do i get total file line number? 

} 

text.txt

line1 
line2 
line3 

Antwort

9

Es gibt keine solche Funktion. Zählen kann durch Lesen ganze Linien

std::ifstream f("text.txt"); 
std::string line; 
for (int i = 0; std::getline(f, line); ++i) 
    ; 

oder durch das Lesen zeichen weise und Überprüfung für Zeilenvorschub

std::ifstream f("text.txt"); 
char c; 
int i = 0; 
while (f.get(c)) 
    if (c == '\n') 
     ++i; 
+0

Ich habe 0 für die zweite Funktion – NewFile

+0

ersten funktioniert :) – NewFile

+0

@NewFile Sie haben Recht, 'Operator >>()' überspringt Leerzeichen, natürlich. Danke, behoben. –

1

Haben Sie einen Zähler auf Null initialisiert. Lesen Sie die Zeilen nacheinander, während Sie den Zähler erhöhen (der tatsächliche Inhalt der Zeile ist nicht interessant und kann verworfen werden). Wenn dies erfolgt ist und kein Fehler aufgetreten ist, ist der Zähler die Anzahl der Zeilen.

Oder Sie können die gesamte Datei in den Speicher lesen, und zählen Sie die Zeilenumbrüche in den großen Blob von Text "Daten".

11

ich so tun würde:

ifstream aFile ("text.txt"); 
    std::size_t lines_count =0; 
    std::string line; 
    while (std::getline(aFile , line)) 
     ++lines_count; 

Oder einfach,

#include<algorithm> 
    #include<iterator> 
    //... 
    lines_count=std::count(std::istreambuf_iterator<char>(aFile), 
      std::istreambuf_iterator<char>(), '\n'); 
+1

in "while (Std :: getline (aFile, Linie))" Was ist Linie? – NewFile

+0

@NewFile aktualisiert – P0W

+5

+1 für die Variante ['std :: count'] (http://en.cppreference.com/w/cpp/algorithm/count). –

2

Ich fürchte, Sie es so selbst schreiben müssen:

int number_of_lines = 0; 
std::string line; 
while (std::getline(myfile, line)) 
     ++number_of_lines; 

std::cout << "Number of lines in text file: " << number_of_lines; 
0

Schnelle Weg dann über Lösungen wie P0W ein speichern 3-4 Sekunden pro 100mb

erfolgen
std::ifstream myfile("example.txt"); 

// new lines will be skipped unless we stop it from happening:  
myfile.unsetf(std::ios_base::skipws); 

// count the newlines with an algorithm specialized for counting: 
unsigned line_count = std::count(
    std::istream_iterator<char>(myfile), 
    std::istream_iterator<char>(), 
    '\n'); 

std::cout << "Lines: " << line_count << "\n"; 
return 0; 
+0

Die Verwendung von istreambuf_iterator statt istream_iterator macht es in meinen Experimenten fünfmal schneller. – gus3001