通过dict文件阅读"单词"并添加到特里

时间:2015-10-21 06:07:10

标签: c trie getc

对于这个问题,我必须阅读并区分一个单词是什么。一个词不需要有意义,即。一个词可以是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(()) 这个词是:dictionary,LoL,FFDAfg。 我需要阅读这些字符,如果它是一封信,我需要直接将其添加到trie中(我没有弄清楚如何通过一次只添加一个字符来管理trie)或者我必须跟踪每个字符并将其放入一个字符串中,一旦我达到一个非字母字符,我需要添加" word"进入特里。

我的结构是:

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];
}
}

我相信如果我最终将一个字符串插入到一个trie中,这个方法会起作用,但我的问题是我不知道如何从我之前的readDict文件中获取一个字符串。另外我不知道如何修改这个(如果可能的话)一次插入一个字符,所以我可以通过char读取我的字符,然后检查它是否是一个字母并转换为小写添加到trie中如果不是那里。

1 个答案:

答案 0 :(得分: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);
}