2013-10-02 22 views
5

Czy istnieje funkcja, której można użyć do uzyskania całkowitego numeru wiersza pliku w numerze C++, lub czy trzeba to zrobić ręcznie za pomocą pętli for?C++ Uzyskaj całkowity numer wiersza pliku

#include <iostream> 
#include <ifstream> 

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

} 

text.txt

line1 
line2 
line3 

Odpowiedz

9

Nie ma taka funkcja. Liczenie może odbywać się poprzez czytanie całych linii

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

lub czytając znak mądry i sprawdzanie wysuw wiersza

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

Mam 0 dla drugiej funkcji – NewFile

+0

pierwsza działa :) – NewFile

+0

@NewFile Masz rację, operator '()' oczywiście pomija białą przestrzeń. Dziękuję, poprawiono. –

1

Posiada licznik, zainicjowany na zero. Czytaj linie, jeden po drugim, zwiększając licznik (rzeczywista zawartość linii nie jest interesująca i można ją odrzucić). Po zakończeniu i nie wystąpił błąd, licznik jest liczbą linii.

Albo możesz przeczytać cały plik w pamięci i policzyć nowe linie w dużym obszarze tekstowym "danych".

11

zrobiłbym tak:

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

lub po prostu

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

w "while (std :: getline (aFile, line))" co to jest linia? – NewFile

+0

@NewFile updated – P0W

+5

+1 dla wariantu ['std :: count'] (http://en.cppreference.com/w/cpp/algorithm/count). –

2

boję trzeba napisać go samemu tak:

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

szybki sposób następnie powyżej rozwiązań, takich jak P0W jednej Zapisz 3-4 sekund za 100mb

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

Używanie istreambuf_iterator zamiast istream_iterator czyni to 5 razy szybciej w moich eksperymentach. – gus3001