2010-06-18 158 views
20

如何計算使用標準類fstreamifstream的行數?如何在C++中計算文件的行數?

+9

氣味像家庭作業 - 你到目前爲止嘗試過什麼? – KevinDTimm 2010-06-18 20:24:15

+10

從'1'開始,併爲文件中的每一行添加1。 – 2010-06-18 20:25:44

+4

@Noah:空文件有一行? – 2010-06-18 21:39:33

回答

82

如何: -

std::ifstream inFile("file"); 
    std::count(std::istreambuf_iterator<char>(inFile), 
      std::istreambuf_iterator<char>(), '\n'); 
+0

這就是我所說的,如果你沒有在我面前說過。儘管如此,你的方式稍微好一點... +1 – fingerprint211b 2010-06-18 20:39:38

+0

只記得一些事情,如果最後一行沒有\ n? – fingerprint211b 2010-06-18 20:42:48

+5

@ fingerprint211b:添加一個結果:-)總是有這種權衡,無論你在文件結尾處有換行符。 – Abhay 2010-06-18 20:44:45

12

您逐行讀取文件。 計算您閱讀的行數。

+20

這聽起來像一個_huge_過度複雜! ;-) – 2010-06-18 20:34:35

-2

int numLines = 0; 
ifstream in("file.txt"); 
//while (! in.eof()) 
while (in.good()) 
{ 
    std::string line; 
    std::getline(in, line); 
    ++numLines; 
} 

還有就是你如何對待該文件的最後一行,如果它不以回車結束的問題。取決於你在做什麼,你可能想要計算它,而你可能不會。這段代碼統計了它。

請參見:http://www.cplusplus.com/reference/string/getline/

+7

'while(!in.eof())'<--- NOOOOO!如果有任何類型的文件讀取失敗,這會給垃圾。把'std :: getline'作爲時間的條件。 – 2010-06-18 20:36:55

+3

編輯後它仍然無效,因爲如果'std :: getline'失敗,則增加行數,並且不檢查它是否成功,直到後面。將'std :: getline'移到while的條件。 – 2010-06-18 20:46:04

10

這是克雷格·賴特W.的答案的正確版本:

int numLines = 0; 
ifstream in("file.txt"); 
std::string unused; 
while (std::getline(in, unused)) 
    ++numLines; 
+0

std :: getline(in,std :: string()) - 將一個非const引用綁定到一個臨時對象不是合法的C++。 – Pietro 2013-04-08 14:16:02

+0

@Pietro:好點。固定! – 2013-04-08 21:25:10

-10

分割文件的大小由平均每行的字符!

以下@Abhay

一個完整的代碼,我已經做了

+0

如何確定每行不讀取文件的平均字符數?如果你計算的字符,你可能只是計數換行符;這種無效的答案。 – 2010-06-19 01:27:31

-1
int aNumOfLines = 0; 
ifstream aInputFile(iFileName); 

string aLineStr; 
while (getline(aInputFile, aLineStr)) 
{ 
    if (!aLineStr.empty()) 
     aNumOfLines++; 
} 

return aNumOfLines; 
0

核方法:

size_t count_line(istream &is) 
{ 
    // skip when bad 
    if(is.bad()) return 0; 
    // save state 
    std::istream::iostate state_backup = is.rdstate(); 
    // clear state 
    is.clear(); 
    std::istream::streampos pos_backup = is.tellg(); 

    is.seekg(0); 
    size_t line_cnt; 
    size_t lf_cnt = std::count(std::istreambuf_iterator<char>(is), std::istreambuf_iterator<char>(), '\n'); 
    line_cnt = lf_cnt; 
    // if the file is not end with '\n' , then line_cnt should plus 1 
    is.unget(); 
    if(is.get() != '\n') { ++line_cnt ; } 

    // recover state 
    is.clear() ; // previous reading may set eofbit 
    is.seekg(pos_backup); 
    is.setstate(state_backup); 

    return line_cnt; 
} 

它不會改變原始文件流狀態,包括「\ N'-二小姐的情況處理爲最後一行。

+0

返回1表示空白文件或沒有文件。 – masoomyf 2018-01-30 11:42:15

+0

我覺得0可能會更好? – 2018-01-30 12:32:35

+0

如果文件或文件中沒有任何內容不存在,則爲0是必需的。但是這個函數爲空白文件返回零。 – masoomyf 2018-01-31 18:23:15