Прочитав файл DICT найти слова и добавить в Trie
Для этой проблемы я должен прочитать и понять, что это за слово. Слово не должно быть значимым, т.е. слово может быть asdas, sdgsgd, dog, sweet и т.д... Чтобы получить доступ к я должен сделать это через файл сопоставления.
File *map, *dictfile, *datafile;
char *dictname, *dataname;
map = fopen(argv[1],"r");
while (fgets(buffer,sizeof(buffer),map) != NULL)
{
dictname = strtok(buffer," ");
dataname = strtok(NULL, " ");
strtok(dictname,"\n");
strtok(dataname,"\n");
этот код попадает в файл сопоставления, а затем различает имена файлов и. от их открываю файл
if((datafile = fopen(dictname,"r")) == NULL) //error checking
{
in here I have to call a readDict(dictfile)
}
Моя проблема в readDict, я должен идти символ за символом в этом файле dict, чтобы различить, что на самом деле является словом, а что нет. Слово может состоять из любого алфавитного символа. Допустим, содержит: словарь $@#$LoL!@#FFDAfg(()) слова в этом являются: словарь, LoL, FFDAfg. Мне нужно прочитать эти символы, и если это буква, мне нужно либо напрямую добавить это в три (что я не понял, как управлять три, только добавляя символ за раз), либо я должен отслеживать каждый символ и положить его в строку, и как только я достигну не алфавитного символа, мне нужно добавить это слово в три.
моя структура структуры:
struct trieNode
{
bool isWord;
struct trieNode *children[26]; //26 given there are 26 letters in the alphabet
};
У меня есть метод
struct trieNode *createNode()
{
int i;
struct trieNode *tmp = (struct trieNode*)malloc(sizeof(struct trieNode));
for (i = 0; i<26;i++)
tmp -> children[i] = NULL;
tmp -> isWord = false;
return tmp;
мой текущий метод вставки:
void insert(char *key)
{
int level = 0;
int index = getIndex(key[level]); //previously defined just gets the index of where the key should go
int len = strlen(key);
if(root == NULL)
root = createNode(); //root is defined under my struct def as: struct trieNode *root = NULL;
struct trieNode *tmp = root;
for (level = 0; level < len; level++)
{
if (tmp -> children [index] == NULL)
tmp ->children[index] = createNode();
tmp = tmp->children[index];
}
}
Я считаю, что этот метод будет работать, если я в конечном итоге вставлю строку в три, но моя проблема в том, что я не уверен, как получить строку из моего более раннего файла readDict. Также я не уверен, как изменить это (если возможно), чтобы вставлять символ за раз, чтобы я мог просто прочитать свой символ за символом и после того, как я проверю, является ли это буквой, и преобразовать в строчные буквы, добавить в trie, если это не так. там.
1 ответ
Так что один грубый способ сделать это что-то вроде этого. Возможно, вам придется добавить еще несколько условий для обработки некоторых крайних случаев.
void *readDict(char *fileName)
{
FILE *file = fopen(fileName, "r");
char *word = malloc(100);
int index = 0;
int c;
while ((c = fgetc(file)) != EOF)
{
char ch = (char)c;
if (isalpha(ch)) // check if ch is a letter
word[index++] = ch;
else
{
word[index] = '\0';
index = 0;
insert(word);
}
}
fclose(file);
}