Gremlin92
@Gremlin92
Целеустремленный

Неправильно разделяет слова?

Пытаюсь подсчитать количество слов повторений в тексте выдается лабуда со словом "материале" хотя оно встречается лишь однажды вот исходный текст https://dropmefiles.com/n8Xok и обработанный https://dropmefiles.com/m3lYM и сам код:
#include <iostream>
#include <fstream>
#include <vector>
bool f(char c)
{
	if (c == ' ' || c == ',' || c == '.' || c == '?'
		|| c == ':' || c == ';' || c == '<'
		|| c == '>' || c == '!' || c == '-' || c=='\n' ||
		c == '1' || c == '2' || c == '3' || c == '4'
		|| c == '5' || c == '6' || c == '7'
		|| c == '8' || c == '9' || c == '0')
		return true;
	else
		return false;
}
int main()
{
	std::vector<std::pair<int, std::string>> v;
	std::pair<int, std::string> p;
	setlocale(LC_ALL, "en_US.UTF-8");
	char buff[255]; // буфер промежуточного хранения считываемого из файла текста
	std::ifstream fin("text.txt"); // (ВВЕЛИ НЕ КОРРЕКТНОЕ ИМЯ ФАЙЛА)
	std::ofstream fout("word.txt"); // создаём объект класса ofstream для записи и связываем его с файлом cppstudio.txt
	if (!fin.is_open()) // если файл не открыт
		std::cout << "Файл не может быть открыт!\n"; // сообщить об этом
	else
	{
		//fin >> buff; // считали первое слово из файла
		//std::cout << buff << std::endl; // напечатали это слово
		std::string str;
		while (fin.getline(buff, 255))
		{
			for (int i = 0; i < 255; i++)
			{
				
				if(f(buff[i]))
				{
					p.first = 0;
					p.second = str;
					std::cout << str << std::endl;
					fout <<str<<'\n'; // запись строки в файл
					v.push_back(p);
					str.clear();
				}
				else
					str += buff[i];
			}
		} // считали строку из файла
		fin.close(); // закрываем файл
		//std::cout << buff << std::endl; // напечатали эту строку
	}
	fout.close();
	system("pause");
	return 0;
}
  • Вопрос задан
  • 47 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert

for (int i = 0; i < 255; i++)
      {
        if(f(buff[i]))

лабуда со словом "материале"

ты анализируешь строку побайтно, поэтому и лабуда. Анализируй посимвольно, с учётом кодировки, т.е. продвигайся вперёд не на один байт, а на 1 байт и все последующие байты со старшими битами равными 10:

for (int i = 0; i < 255;)
      {  
        if(f(buff[i]))
        {
          ....
          i++;
        } else {
          do
            str += buff[i++];
          while ((buff[i] & 0xc0) == 0x80);
        }
      }
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы