2017-10-24 12 views
2

私は、テキストファイル内のユニークな単語を数えるワードカウンタを作成する必要があるプロジェクトに取り組んでいます。授業ではSTLについて学んだだけで、地図を使ってプログラムを作成することになっています。私がファイルから単語を読み込んで正確に数えますが、必要な記号や数字は無視されません。たとえば、今のように、単語 "ファイル"と "ファイル"を数えます。 2つの別々の単語として。どうすれば修正できますか?もう1つの問題は、単語をアルファベット順に印刷することです。これは私がこれまで持っていたものです。C++文字列に読み込むときに、テキストファイルのシンボル/数値を無視するにはどうすればよいですか?

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

template <class words, class counter> 
void PrintMap(map<words, counter> map) 
{ 
    typedef std::map<words, counter>::iterator iterator; 
    for (iterator p = map.begin(); p != map.end(); p++) 
    cout << p->first << ": " << p->second << endl; 
} 

int main() 
{ 
    static const char* fileName = "D:\\MyFile.txt"; 

    map<string, int> wordCount; 
    { 
     ifstream fileStream(fileName); 

     if (fileStream.is_open()) 
      while (fileStream.good()) 
      { 
       string word; 
       fileStream >> word; 

       if (wordCount.find(word) == wordCount.end()) 
        wordCount[word] = 1; 
       else 
        wordCount[word]++; 
      } 
     else 
     { 
      cerr << "Couldn't open the file." << endl; 
      return EXIT_FAILURE; 
     } 
     PrintMap(wordCount); 
    } 
    system("PAUSE"); 
    return 0; 
} 

答えて

0

あなたは、あなたのWORDCOUNT辞書にそれを確認する前に、各文字列にはしたくないシンボルを取り除くために別の関数を書くことができます。たとえば、新しい単語を読んだら、文字を1文字ずつ出て、その文字を通って文字があるかどうかを調べる、小さなトリム関数を実行することができます。または ' - 'など。

0

原則として、Jake Killpackの答えは正しいです。文字列を読み取ってから、またはをトリムすると、C++で文字列がどのように読み取られるかの動作が調整されます。 documentationによれば:

operator >>]は[...]次にから文字を読み取ることで、次のいずれかの条件が真になるまで、 str.append(1、c)であるかのようにそれらをstrを付加します:

  • [...]
  • のstd :: isspace(C、is.getloc())(この空白文字は入力ストリームのまま)での次の文字cについても同様です。

は明らかに、句読点には空白ではないので、彼らが読んで、同様の単語に追加されます。これを変更するには、std::isspace s.tの動作を調整する必要があります。

struct punctws_ctype : std::ctype<char> { 
    static const mask* table() { 
     static std::vector<mask> v(classic_table(), classic_table() + table_size); 
     v[','] |= space; // classify comma as whitespace 
     v['.'] |= space; // accordingly... 
     v['-'] |= space; 
     return &v[0]; 
    } 

    my_ctype(std::size_t refs = 0) : std::ctype<char>{ table(), false, refs } { } 
}; 

以降では、ストリームで読む前に:それは厄介だとしても、行うことができ、空白と句読点を扱う

// apply the modified behaviour to the stream: 
fileStream.imbue(std::locale{ fileStream.getloc(), new my_ctype }); 

fileStream >> wordを読むとき、それは取り除くことができますすぐにどんな句読点も。

関連する問題