2017-10-09 8 views
0

入力ファイルを解析し、別個の文字、各単語の平均長さ、合計単語数などの情報を出力する関数を記述しようとしています。私は、文字列内の別個の文字をどのように追跡するかを考え出すのに問題があります。例として、次の行があります。別個の文字や単語を追跡するには?

そうでなければ、それは問題です。

10単語、12文字、3.2平均単語長を返します。

これは私がこれまで持っているコードです:

void fileInfo(const string& fileName) 
{ 
    ifstream in(fileName); 
    if (in.fail()) 
    { 
      cout << "Error, bad input file."; 
    } 

    string line = ""; 
    int wordTotal = 0; 
    while (getline(in, line)) 
    { 
      istringstream ss(line); 
      string word = ""; 
      while (ss >> word) 
      { 
       wordTotal++; 
       for (size_t i = 0, len = word.size(); i < len; i++) 
       { 
        if (word.at(i)) 
       } 
      } 
    { 






} 
+0

'std :: set'は重複を格納しないので、' std :: set 'を使って、単語の各文字をセットに挿入することができます。 – PaulMcKenzie

答えて

0

一つの解決策は、各単語の文字を格納するのにstd::unordered_set<char>を使用することです。 unordered_setには重複が格納されていないので、別々の文字のセットで終わります。

第2に、セット内に配置する前に句読点や数字ではなくアルファベット文字を数えたいだけです。したがって、各文字をアルファベット順にフィルタリングする必要があります。

void fileInfo(const string& fileName) 
{ 
    std::unordered_set<char> cSet; 
    //... 
    while (ss >> word) 
    { 
     wordTotal++; 
     for (auto v : word) 
     { 
      if (std::isalpha(v)) 
       cSet.insert(std::tolower(v)); 
     } 
    }  
    //... 
} 

Live Example

それがアルファベットであればワードのみセット内に挿入されます。また、挿入された文字は小文字のバージョンであることに注意してください。

関連する問題