2014-01-27 54 views
-2

即時尋找計算代碼中的行數我發現我需要從文件中查找特定的字符並每次增加一個找到了。現在我有一個大致的要點,但我很難找出如何讀取文件中的每一行。我發佈了迄今爲止我所擁有的內容。任何幫助,將不勝感激創建一個讀取的程序計算C++文件中的行數

#include<fstream> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    ifstream readfile; 
    readfile.open("project1b.cbp"); 
    int number_of_lines=0; 
    char = ch; 
    while(ch !=EOF) 
    { 
     if(ch!='endl'||';') 
     number_of_lines++; 
    } 


    return 0; 
} 
+1

'while(std :: getline(string,file) )n_lines ++;' - btw,爲什麼這個標記爲C? – 2014-01-27 20:40:04

+1

這是練習的一部分嗎?如果不是,我會建議看看http://www.dwheeler.com/sloccount/ – Martin

回答

0

您可以使用std::getline獲取每一行。

+0

他們需要「代碼行「雖然。 – juanchopanza

+0

你可以做一個對單行註釋中需要的字符檢查行[0]和行[1]。 – crnlx

2

if(ch!='endl'||';') 

不會做你的想法。您正在檢查ch不等於endl,或;是。而且由於;總是正確的(不是零),所以在這裏你並沒有真正有用的比較。

你可能會想的

if(ch!='endl'|| ch!=';') 

或者類似的東西。不知道你正在努力實現與你相比...

至於你的問題的另一部分 - 前谷歌命中「C按行++讀取文件行」你得到以下答案計算器:

https://stackoverflow.com/a/7868998/1967396

這就是你需要的一切。

還有一件事 - 你需要更清楚地定義一個「代碼行」是什麼。基本上是「任何回車,或任何分號」一條新線?分號後跟新行呢?如何處理帶有兩個分號的行(一行中有兩條語句)?

爲了清晰你的想法,你會更加困惑。我建議您拆分邏輯爲

  1. 從文件獲取一行
  2. 計數分號
  3. 如果有分號,還有什麼注意事項後,他們
  4. 決定如何計算這些

最後想到:單引號' '用於定義字符常量。雙引號" "用於定義字符串常量。行尾字符通常是\n\r;在C++中,我們使用std::endl作爲編寫它的一種方式 - 但它不在引號中。當你使用namespace std大概你可以寫endl當你的意思是'\n'。但是單引號引起了我的困惑 - 也可能是編譯器。

+0

啊我明白了。我想要得到的是,如果我在我的行中有這些字符中的任何一個,它將作爲一行計數,並將行計數增加一。 – MoMo8

+2

@ user3006893和你期望'endl'是什麼?你甚至讀過任何文檔嗎?它是一個隨機的多字符字符串文本,當你到達一行的結尾時,你不會得到這樣的結果(當你這樣做時,你會得到''\ n''或''\ r'')。 – 2014-01-27 20:47:16

0

試試這個:

#include <fstream> 
#include <iostream> 
using namespace std; 

int main(int argc, char **argv){ 
    if(argc!=2){ 
    cout<<"Syntax: "<<argv[0]<<" <FILENAME>"<<endl; 
    return -1; 
    } 

    ifstream readfile(argv[1]); 
    if(!readfile.good()){ 
    cout<<"Failed to open file: '"<<argv[1]<<"'!"<<endl; 
    return -1; 
    } 

    int number_of_lines=0; 
    while(readfile.good()){ 
    char ch=readfile.get(); 
    if(ch=='\n'|| ch==';') 
     number_of_lines++; 
    } 

    cout<<"Number of lines: "<<number_of_lines<<endl; 

    return 0; 
} 

從你的代碼的某些差異。

  • 我使用argc and argv,以便用戶可以在命令行中指定一個文件名。
  • 我使用ifstream readfile(argv[1])加載文件。這適合C++中常用的RAII(資源獲取是初始化)方案。我不使用close()聲明,因爲ifstream將超出範圍並自動清理自己。使用RAII可以使您的代碼更清晰並且不易出錯。
  • 我用get()從字符流中獲取新的字符。這在代碼中缺失。
  • \n(換行符)字符是我們目前正在查看的字符,或者我們正在查看;字符時,會發生該行的結尾。 endl不是一個字符常量 - 它更像是一個流操作符 - 所以你不能以你所使用的方式來使用它,也不能一般地比較這種類型。
  • 請注意,or運算符(||)除了兩個完整的邏輯語句,您使用它的方式((ch!='endl'||';'))不會像您認爲的那樣工作。
  • 我選擇使用K&R style支撐,而不是你的異教徒Allman/GNU style。 (這是一個笑話的東西,但我鼓勵你去嘗試幾種不同的風格,找到一個最適合你的。我喜歡ķ& R表示SO因爲代碼更加緊湊。

你應該問自己,如果例如,一個for構造(for(int i=0;i<N;++i))最終會看起來像使用公制的三行代碼。

+0

感謝您的幫助。你提供的程序給了我一個正確的方向。我並不真正瞭解K&R的風格,因爲我是我的學生,我們基本上只是在某種意義上留給了我們自己的設備。但是我有點喜歡你提到的風格,因爲它對我來說最合乎邏輯。我可以看到我所有的大括號都不必擔心丟失一個。我認爲這是我自己開發的東西。我確實有一個問題,關於你是否有任何關於成爲像你這樣的更好的程序員的技巧。我有時覺得我的學校讓我失望了。或者這是noobs常見的嗎? – MoMo8

+0

我覺得我的程序讓他們工作,但他們很短。這可能僅僅是我的思維方式和儘可能簡單的想法的證明? – MoMo8

+0

開發您的代碼應該看起來是否有用的美感:縮進和括號。我喜歡K&R風格,因爲我很少忘記括號,因此希望它們不顯眼。當我開始時,我想學習如何編寫遊戲。弄清楚如何編寫「猜數字」遊戲,嘗試編寫[Hunt the Wumpus](https://en.wikipedia.org/wiki/Hunt_the_Wumpus)。總是從簡單的遊戲版本開始,然後添加元素使其更加複雜。 – Richard

相關問題