2016-07-19 9 views
2

テキストファイルから特定の単語の出現を数えようとしていますが、問題はコードがファイルを読み込んでいるときです。空白の区切り文字で読み込んでいますが、いくつかの単語i例えば、 "out from"のような "2 word words"であることをカウントしたい場合は、C++のカウント機能語発生

これに加えて、2番目の問題があります。これは "not"と "do not"のような言葉です - 私のコードは無視するようですこの言葉を地図にバックスラッシュで入れても、私は何らかの理由でファイルからそれを読み取る過程で無視されているということです。

私が探している最終結果は、私が探している言葉。

std::list<std::string> Fwords = { 
"a","abroad","as far as","ahead of"}; 

     // Begin reading from file: 
     std::ifstream fileStream(fileName); 

     // Check if we've opened the file (as we should have). 
     if (fileStream.is_open()) 
      while (fileStream.good()) 
      { 
       // Store the next word in the file in a local variable. 
       std::string word; 
       fileStream >> word; 
       std::cout << "This is the word: " << word << endl; 

       if (std::find(std::begin(Fwords), std::end(Fwords), word) != std::end(Fwords)) 
        wordsCount[word]++; 
      } 

入力:このアプローチは機能しません

abroad:1 
ahead of:1 
as far as:1 
+0

「あなたのところまで」という言葉はひとつの単語として扱われるべきですか? – Arunmu

+1

あなたは[mcve]を作っていただけますか?私たちはあなたがカウントしたいすべての単語を見る必要はありません – user463035818

+0

@LogicStuff、彼は、それはちょうどノーオペレーションです。 – GreatAndPowerfulOz

答えて

0

"ahead of me as far as abroad me" 

が、これが予想される出力となります。あなたの問題は、ファイルから一度に1語ずつ読むことです。バックスラッシュや単語のリスト/マップの量はそれを修正するものではありません。

しかし、どのくらいの単語を読むべきかを知っていますか?あなたは試行錯誤する必要はありません。あなたはは言葉でを開始することをマップ内の単語をチェックする「ブルートフォース」これは、プログラミングのあなたのレベルを考えると、

if (std::find(std::begin(Fwords), std::end(Fwords), word) != std::end(Fwords)) 
{ 
    // ... 
} 

elseケースを追加することですする

一つの方法ファイルから "as"と入力しますが、空白があるため、検索はasです。 1つ以上の一致が見つかった場合は、ファイルから別の単語を読み取る時間です。「まで」これは、ループ(またはループ内で呼び出される関数)に入れて、as farの検索と別の単語 "as"の読み取りが自動的に行われるようにする必要があります。 as far asが見つかりましたら、完了です。 asas far、またはas far as,、つまりがマップに含まれていない場合は、forのループを実行して単語であるかどうかを確認することもできますそうであれば、その数を増やしてください。この作業では、元のコードと同じコードが必要であることがわかります。だからそれを関数にも組み込むことは賢明だろう。