Кажется, вам нужно проверить словарь, чтобы увидеть, содержит ли оно каждое прочитанное вами слово, а затем выбрать, какие из KnownWords
и UnknownWords
нужно изменить.
void WordStats::ReadTxtFile(){
std::ifstream ifile(Filename);
if(!ifile)
{
std::cerr << "Error Opening file " << Filename << std::endl;
exit(1);
}
Я очистил ваши локальные объявленияпоэтому переменные остаются живыми столько времени, сколько необходимо.
Предполагая, что файл содержит слова, разделенные пробелами и символами новой строки, прочитайте каждое слово
for (std::string word; ifile >> word; )
{
Сделайте его строчным
transform (word.begin(), word.end(), word.begin(), ::tolower);
Затем посмотрите, находится ли оно в Dictionary
if (Dictionary.count(word))
{
Запишите положение в KnownWords[word]
.
KnownWords[word].push_back(ifile.tellg());
}
else
{
Или в UnknownWords[word]
.
UnknownWords[word].push_back(ifile.tellg());
}
}
Затем выведите size
s из них, чтобы получить желаемый результат.
std::cout << KnownWords.size() << " known words read." << std::endl;
std::cout << UnknownWords.size() << " unknown words read." << std::endl;
}
Вы можете заменить условный оператор, который дублирует действие, условным выражением.Обратите внимание на тип ссылки в объявлении Words
WordMap & Words = (Dictionary.count(word) ? KnownWords : UnknownWords);
Words[word].push_back(ifile.tellg());
В качестве полной функции:
void WordStats::ReadTxtFile(){
std::ifstream ifile(Filename);
if(!ifile)
{
std::cerr << "Error Opening file " << Filename << std::endl;
exit(1);
}
for (std::string word; ifile >> word; )
{
transform (word.begin(), word.end(), word.begin(), ::tolower);
WordMap & Words = (Dictionary.count(word) ? KnownWords : UnknownWords);
Words[word].push_back(ifile.tellg());
}
std::cout << KnownWords.size() << " known words read." << std::endl;
std::cout << UnknownWords.size() << " unknown words read." << std::endl;
}