Я работаю над «словарем» для своего класса. У меня есть массив int с именем NumOfWordsInFile []
, где NumOfWordsInFile [0]
соответствует количеству слов в A. txt и NumOfWordsInFile [25]
соответствует Z.txt
На данный момент у меня есть огромный переключатель для 26 различных состояний букв. У меня есть функция под названием AddWord (строковое слово)
. AddWord получает первую букву переданного слова и вставляет ее в соответствующий файл .txt. Теперь вот в чем проблема. Каждый раз, когда слово добавляется в A.txt, я должен увеличивать NumOfWordsInFile [0]
на 1. Единственный способ, который я могу придумать, - это использовать эти огромные переключатели. У меня также есть функция deleteWord, которая, наоборот, уменьшает NumOfWordsInFile []
, если слово удалено. Теперь я не хочу иметь два переключателя корпуса 26, но проблема в том, что я не знаю, как еще это сделать. Теперь я мог бы проделать то же самое с функцией удаления, но я действительно не хочу, чтобы для прохождения еще сотни строк кода. Есть ли лучший способ сделать это?
Пример переключателя в функции AddWord
:
case 'w':
if (numOfWordsInFile[22] < maxWordsPerFile) {
fout.open(fileName.data(), ios::app);
fout << word << " " << endl;
numOfWordsInFile[22]++;
if (totalWordsInDict < maxWordsInDict) {
totalWordsInDict++;
}
return(Dictionary::success);
} else {
return(Dictionary::failure);
}
case 'x':
if (numOfWordsInFile[23] < maxWordsPerFile) {
fout.open(fileName.data(),ios::app);
fout << word << " " << endl;
numOfWordsInFile[23]++;
if (totalWordsInDict < maxWordsInDict) {
totalWordsInDict++;
}
return(Dictionary::success);
} else {
return(Dictionary::failure);
}
Функция удаления.
bool Dictionary::DeleteAWord(string word)
{
ofstream fout;
ifstream fin;
string x;
string fileName="#.txt";
int count=0;
vector <string> words;
bool deleted=false;
fileName[0]=toupper(word[0]);
fin.open(fileName.data()); //makes the file depending on the first letter of the argument "word"
while (fin >> x)
{
words.push_back(x);
count++;//number of elements in vector
}
if (SearchForWord(x))
{
for ( ;count > 0; count--)
{
if (words[count-1] == word)
{
// cout << "Found word " << word << " during search, now deleting" << endl;
words.erase(words.begin()+(count-1));
deleted = true;
/*
This clearly doesn't work and is what I need help with, I know why it
doesn't work but I don't know how to make it better than having another
huge switch.
*/
numOfWordsInFile[toupper(word[0])]--;
/*
*/
totalWordsInDict--;
fin.close();
}
}
if (deleted)
{
fout.open(fileName.data());
for (int i = 0; i < words.size(); i++)
fout << words[i] << endl;
return(Dictionary::success);
}
return(Dictionary::failure);
}
return(Dictionary::failure);
}