web-dev-qa-db-ja.com

C ++ Get Total File Line Number

C++の合計ファイル行数を取得するために使用できる関数はありますか、それともforループによって手動で実行する必要がありますか?

#include <iostream>
#include <ifstream>

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

}

text.txt

line1
line2
line3
6
NewFile

そのような機能はありません。カウントは行全体を読み取ることで実行できます

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

スコープについての注意、変数iは、ループの後でアクセスする場合、 for の外側にある必要があります。


文字ごとに読み、改行をチェックすることもできます

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

私はこのようにします:

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

または単に、

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

私はあなたが自分でそれをこのように書く必要があると恐れています:

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;
2
duDE

ゼロに初期化されたカウンターを用意します。カウンターを増やしながら、行を1つずつ読み取ります(行の実際の内容は重要ではなく、破棄できます)。完了し、エラーがなかった場合、カウンターは行数です。

または、すべてのファイルをメモリに読み込み、テキスト「データ」の大きなブロブの改行を数えることができます。

P0Wのようなソリューションよりも高速な方法では、100mbあたり3〜4秒節約できます。

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
Yash