Я хотел бы предоставить дополнительное решение.
Это не на основе вашего первоначального черновика, а с более современным решением на C ++, использующим контейнеры и алгоритмы STL.
Я бы хотелНастоятельно рекомендуем НЕ использовать массивы C-Style вообще. Пожалуйста, используйте контейнеры STL.
Тогда вернемся к вашей проблеме. Мы разделим задачу в основном на 3 задачи.
- Чтение файла
- Подсчет слов
- Сортировка
Чтение файла в словаэто ультра просто. Просто используйте оператор экстрактора и получите слова как std:string
из текста. Слова могут содержать не буквенные символы. Это мы исключим с помощью std::regex_replace
.
Подсчет также очень прост. Мы используем оператор индекса std::map
[]. Это создаст слово в std::map
, если оно еще не существует````, и увеличит счетчик. Если слово уже существует, то будет просто увеличение счетчика для этого слова.
Поскольку std::map
по умолчанию отсортировано по ключевому значению (слову), мы копируем количество словв std::vector
, затем отсортируйте его и покажите результат.
См.
#include <iostream>
#include <sstream>
#include <iterator>
#include <string>
#include <array>
#include <algorithm>
#include <regex>
#include <map>
#include <iomanip>
#include <utility>
std::istringstream sourceFile{R"(Lorem ipsum dolor sit amet,
consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt
ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero
eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum
dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum
dolor sit amet.)"
};
int main() {
std::string word{};
std::map<std::string, size_t> counter;
// Read complete file into words
while(sourceFile >> word) {
// Replace special characters
word = std::regex_replace(word,std::regex(R"([\.\,\;\:\!\?])"),"");
// Count the occurence of each word
counter[word]++;
}
// We need to sort and will copy the word-counts into a vector
std::vector<std::pair<size_t, std::string>> countedWords;
for( auto const& [key, val] : counter ) {
countedWords.emplace_back(std::pair<size_t, std::string>(val,key));
}
// Do the sort, with a lambda, for the specific request
std::sort(countedWords.begin(), countedWords.end(),
[](std::pair<size_t, std::string> &l, std::pair<size_t, std::string> &r){
return ((r.first == l.first) ? (l.second < r.second) : (r.first < l.first));});
// Show result on screen
int outputCounter{ 5 };
for (const auto& [word, count] : countedWords) {
std::cout << std::setw(20) << word << " --> " << count << "\n";
if (0 >= --outputCounter) break;
}
// Output all words
std::cout << "\n\nAll different word in alphabetical order:\n\n";
// Write all words on screen.
for (const auto& [word, count] : counter) std::cout << word << "\n";
return 0;
}
РЕДАКТИРОВАТЬ:
В конце я добавил вывод для всех слов вв алфавитном порядке.
Дополнительно: Обратите внимание: std::istringstream
- это std::istream
. Нет разницы в файловом потоке. Таким образом, «sourceFile» может быть открытым std::ifstream
или std::cin
или любым другим std::istream
. Нет никакой разницы. Итак, откройте файл, используя std::ifstream sourceFile("c:\\temp\nameOfFile")
- Вот и все.