чтение через файл dict, поиск слов и добавление в trie

Для этой задачи я должен прочитать a и различить, что такое слово. Слово не обязательно должно быть осмысленным, т.е. слово может быть 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. Мне нужно прочитать эти символы, и если это буква, мне нужно либо напрямую добавить это в дерево (которое я не понял, как управлять деревом, добавляя только символ за раз), либо я должен отслеживать каждый символ и помещаю его в строку, и как только я достигаю неалфавитного символа, мне нужно добавить это «слово» в дерево.

моя структура trie:

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, если это не так там.


person bkennedy    schedule 21.10.2015    source источник
comment
Итак, чтобы уточнить: вам нужен список строк из вашего файла readDict?   -  person rohit89    schedule 21.10.2015
comment
ну, мне нужно прочитать файл dict и расшифровать, что следует считать словом, а что нет, но как только я выясню, что такое слово, мне нужно выяснить, как я могу вставить его в дерево @rohit89   -  person bkennedy    schedule 21.10.2015


Ответы (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);
}
person rohit89    schedule 21.10.2015
comment
Я полагаю, вы имели в виду, что он говорит void readDict, верно? потому что вы ничего не возвращаете здесь - person bkennedy; 21.10.2015