2012-10-18 31 views
0

我有一個用於我的高級C++類的項目,它應該可以做很多事情,但我想先關注這個函數,因爲在它工作之後,我可以調整它滿足了其他需求。此功能搜索文件並通過計算文檔中出現的次數來執行字數統計。也許不準確,但這將是一個很好的起點。這裏是我現在的代碼:如何計算C++中的字符串中出現的空白字符

void WordCount() 
    { 
     int count_W = 0; //Varaible to store word count, will be written to label 
     int i, c = 0; //i for iterator 
     ifstream fPath("F:\Project_1_Text.txt"); 
     FileStream input("F:\Project_1_Text.txt", FileMode::Open, FileAccess::Read); 

     StreamReader fileReader(%input); 
     String^line; 
     //char ws = ' '; 
     array<Char>^ temp; 

     input.Seek(0, SeekOrigin::Begin); 

     while ((line = fileReader.ReadLine()) != nullptr) 
      { 
       Console::WriteLine(line); 
       c = line->Length; 
       //temp = line->ToCharArray(); 

       for (i = 0; i <= c; i++) 
       { 
        if (line[i] == ' ' ) 
          count_W++; 
       } 

       //line->ToString(); 
      } 

     //Code to write to label 
     lblWordCount->Text = count_W.ToString(); 
    } 

所有這些工作除了一個問題。當我嘗試運行程序並打開文件時,出現一個錯誤,告訴我索引超出範圍。現在,我知道這意味着什麼,但我不明白問題是如何發生的。而且,如果我不知道是什麼導致問題,我無法修復它。我讀過可以用for循環搜索一個字符串,當然這也適用於char數組,並且在那裏有代碼來執行該轉換,但是在這兩種情況下,我都會得到相同的錯誤。我知道它正在通過文件正確讀取,因爲最終的程序還必須執行字符計數(正在工作),並且從頭到尾完美地讀回目標文檔中每行的大小。無論如何,我沒有想法,所以我想我會諮詢更高的權力。有任何想法嗎?

+1

字符串文字內的反斜槓需要加倍。 –

+0

'String^line;'?這是一個MS特定的C++變體嗎?如果是這樣,請在標籤中提及。 –

+0

@j_random_hacke:看起來像託管C++給我。但是,你是對的... @羅伯特貝瑞:請給它加標籤。 –

回答

1

它可能是你的循環。你從i = 0到i = c,但是i = c太遠了。你應該去I = C-1:

for (i=0; i<c; i++) 
+0

的文檔這一個變化得到了字數工作。非常感謝你 –

+0

不客氣。 – Heinzi

3

計數空白很簡單:

int spaces = std::count_if(s.begin(), s.end(), 
          [](unsigned char c){ return std::isspace(c); }); 

兩點需要注意,雖然:

  1. std::isspace()不能立即char因爲char使用可能需要簽字並且std::isspace()需要int,這是必需的。
  2. 這可以計算空格的數量,而不是單詞的數量(或單詞 - 1):單詞可以由多個連續空格組成的空格序列分隔。
+0

你能解釋這是如何工作的嗎? '[]'的含義是什麼? – user13107

+1

@ user13107:'[]'引入了一個lambda函數(一個具有空的閉包)。這個函數的全部目的是用'char'正確地轉換'int'來調用'std :: isspace()'。 –