2016-07-19 2 views
2

Я пытаюсь подсчитать вхождения определенных слов из текстового файла, проблема в том, что когда мой код читает файл - он читает его с разделителями пробела, но некоторые из слов i хотите посчитать «слова из двух слов», например «out from»C++ count function words occurance

Кроме того, есть вторая проблема, и это слова типа «нет» и «не делают» - мой код, кажется, игнорирует эти слова, даже когда я помещаю их в обратную косую черту на карте, - я предполагаю, что он проигнорирован в процессе чтения из файла по какой-то причине

Конечный результат, который я ищу, - это частота слова, которые я ищу.

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]++; 
      } 

вход:

"ahead of me as far as abroad me" 

это будет ожидаемый результат:

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

Значит, вы говорите, что «насколько» следует рассматривать как одно слово? – Arunmu

+1

Можете ли вы сделать [mcve]? Нам не нужно видеть все слова, которые вы хотите подсчитать – user463035818

+0

@LogicStuff, он может, это просто не-op. – GreatAndPowerfulOz

ответ

0

Этот подход не будет работать. Ваша проблема в том, что вы читаете одно слово за раз от файла . Никакое количество обратного слэш или манипулирование списком/картой слов не исправит это.

Но как вы должны знать, сколько слов читать? Вы не ... это должно быть испытание и ошибка.

Один из способов «грубой силы» это, учитывая уровень программирования, можно было бы добавить в else дело

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

, в котором вы проверить слова в карте, что начинают со словом из файла, например «как», но с пробелом, поэтому поиск осуществляется по адресу as. Если найдено одно или несколько совпадений, то пришло время прочитать другое слово из файла, , например. «как далеко». Это должно быть помещено в цикл (или функцию, вызванную в цикле), так что поиск as far и чтение другого слова «как» происходит автоматически. После успешного поиска as far as, все готово. Вы также не можете найти as, as far или as far as, т. Е., если у вас их нет на карте, и в этом случае вы хотите запустить цикл for через каждое слово, чтобы проверить, являются ли они словами сами по себе, и увеличивайте их количество, если это так. В этом случае вы поймете, что вам нужен тот же код, что и ваш исходный код; поэтому было бы разумно включить его в функцию.