Задание:
Написать программу, которая считывает текст из файла и выводит в другой файл слова из этого текста, расположив слова в порядке убывания частоты их появления. При этом для каждого слова необходимо напечатать число его появлений в исходном файле.
Код
void WordsAnalysisInText(char* path)
{
std::map<std::string, int> words;
// Открытие файла с текстом для анализа
std::ifstream ifs(path, std::ifstream::in);
if (!ifs)
{
std::cout << "Error!";
return;
}
// Создание файла с результатом работы данной функции
int buff_size = ((strchr(path, '\\')) ? (strlen(strchr(path, '\\') + 1)) : strlen(path)) + strlen("Words_analysis_") + 1;
char* wa_file_name = new char[buff_size];
strcpy_s(wa_file_name, buff_size, "Words_analysis_");
if (strchr(path, '\\'))
strcat_s(wa_file_name, buff_size, strchr(path, '\\') + 1);
else
strcat_s(wa_file_name, buff_size, path);
std::ofstream ofs(wa_file_name, std::ofstream::binary);
delete[] wa_file_name;
if (!ofs)
{
std::cout << "Error!";
return;
}
// Анализ текста
buff_size = 64;
char* word = new char[buff_size];
std::string word_str;
char punctuation_chars[] = "(),.!?;:'\"";
while (!ifs.eof())
{
ifs >> word; // Считывание слова
word_str = word;
// Удаление знаков пунктуации
for (int i = 0; i < strlen(punctuation_chars); ++i)
word_str.erase(std::remove(word_str.begin(), word_str.end(), punctuation_chars[i]), word_str.end());
// Если считанное слово уже есть в <Map>
if ((!words.empty() && words.find(word) != words.end() && word_str != words.end()->first) ||
std::string(word) == words.end()->first)
(words.find(word)->second)++;
else
//Добавляем слово в <Map>
words.insert({ word_str, 1 });
}
ifs.close();
std::map<int, std::string> sorted_words;
// Сортировка <map> words
for (auto& word : words)
sorted_words.insert({ word.second , word.first });
for (auto& word : sorted_words)
ofs << word.second << ' ' << word.first << '\n';
ofs.close();
delete[] word;
}
Текст ошибки:
map iterator not dereferencable.
Я так понимаю, это через то, что у меня ключём является string. Как исправить эту ошибку не нарушая логики программы? (первый раз использую map)