CodeInside
@CodeInside

Как исправить ошибку 'map итератор неразыменовываемый'?

Задание:
Написать программу, которая считывает текст из файла и выводит в другой файл слова из этого текста, расположив слова в порядке убывания частоты их появления. При этом для каждого слова необходимо напечатать число его появлений в исходном файле.

Код
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)
  • Вопрос задан
  • 368 просмотров
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
if ((!words.empty() && words.find(word) != words.end() && word_str != words.end()->first) || std::string(word) == words.end()->first)

Условие страшное, отвыкай так писать. Разделяй на поясняющие переменные и группируй проверки скобками.

А проблема в words.end()->first.
en.cppreference.com/w/cpp/container/map/end
Итератор, возвращаемый end() не может быть разыменован.

UPD:
Задача, как я вижу, собеседовательная. У нее есть более простое и быстрое решение с меньшим количеством строк.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы