2017-03-18 14 views
0

私は、テキストファイルから読み込んで単語ごとに文字列を抽出し、バイナリ検索ツリーに格納する関数を書いています。この関数はすべての句読点を無視し、重複する単語を破棄しなければなりません(単語の頻度にのみ追加されます)。fscanf()私のADTノードを置き換えますか?

私の問題は、「while(fscanf(fp、 "%s"、line)!= EOF)」が実行されるたびに、私のrootWordが新しく読み込まれた単語に置き換えられます。私はfscanfがこれをどうすることが可能であるかを理解できません。

typedef struct word * wordPtr; 
typedef struct position * positionPtr; 

typedef struct position 
{ 
    int position; 
    positionPtr nextPosition; 
} Position; 
typedef struct word 
{ 
    char * word; 
    unsigned freq; 
    positionPtr firstPosition; 
    wordPtr leftWord; 
    wordPtr rightWord; 
} Word; 

typedef struct bstWord 
{ 
    wordPtr rootWord; 
    unsigned wordCount; 
} BSTWord; 

int BSTCreate(BSTWord* bst, char* fileName) 
{ 
    FILE * fp = fopen(fileName,"r"); 
    char line[MAX_WORD_LEN + 1]; 
    int charCount = 0; 
    char * token; 
    char delimit[] = "\t\r\n\v\f,.-;:\"\' ";  

    while (fscanf(fp, "%s", line)!=EOF) 
    { 
     wordPtr prev = NULL, curr = bst->rootWord;   
     wordPtr newWord; 
     positionPtr newPosition; 
     int lessThen; 
     int status = 1;       
     token = strtok(line, delimit);   
     charCount = charCount + 1;   

     while(curr!=NULL) 
     { 
      prev = curr; 

      if(strcmp(token, curr->word)<0) 
      { 
       printf("\nless"); 
       lessThen = 1; 
       curr = curr->leftWord; 
       status = 1; 
      } 
      else if(strcmp(token, curr->word)>0) 
      { 
       printf("\nmore"); 
       lessThen = 0; 
       curr = curr->rightWord; 
       status = 1; 
      } 
      else if(strcmp(token, curr->word)==0) //If word is already in tree, add freq + update position 
      { 

       if ((newPosition = malloc(sizeof(Position))) == NULL) 
        return FAILURE; 

       newPosition->position = charCount; 
       newPosition->nextPosition = NULL; 

       positionPtr prevPosition = NULL, currPosition = curr->firstPosition; 
       while(currPosition!=NULL) 
       { 
        prevPosition = currPosition; 
        currPosition = currPosition->nextPosition; 
       } 
       prevPosition->nextPosition = newPosition; 
       status = 0; 
       curr = NULL; 
       break; 
      } 

     } 
     if(status == 1) 
     { 
      if ((newWord = malloc(sizeof(Word))) == NULL) 
       return FAILURE; 

      if ((newPosition = malloc(sizeof(Position))) == NULL) 
       return FAILURE; 

      newPosition->position = charCount; 

      newWord->word = token; 
      newWord->freq = 1; 
      newWord->firstPosition = newPosition; 
      newWord->leftWord = NULL; 
      newWord->rightWord = NULL; 

      if(bst->rootWord == NULL) 
       bst->rootWord = newWord; 
      else 
      { 
       if(lessThen) 
       { 
        prev->leftWord = newWord; 
       } 
       else 
       { 
        prev->rightWord = newWord; 
       } 
      }   
     } 
     bst->wordCount++; 
    } 
    fclose(fp);   
    free(fp); 

    return SUCCESS; 
} 
+1

:あなたは追加のメモリを割り当て、そこに文字列をコピーする必要が

char line[MAX_WORD_LEN + 1]; 

'strtok()'は新しいバッファを割り当てませんが、渡されたバッファにポインタを返します。 – EOF

+0

私はそれを知らない、私はそれを見て、ありがとう。 –

答えて

0
newWord->word = token; 

あなたがに割り当てられた同じメモリへのすべてのトークンのポイント:あなたはそれを認識している

newword->word = malloc(strlen(token) + 1); 
strcpy(newword->word, token); 
+0

ありがとう!それを実現しなかった。 –

関連する問題