首页 文章

C fgets()只处理最后一行

提问于
浏览
0

我正在尝试编写一个接收.txt文件的程序,读取所有行,然后将每个单词存储到BST中 . 然后我执行inorder遍历以按字母顺序打印单词 . 如果文本文件只包含1行,则程序可以正常工作,但如果文本文件包含多行,则会出现意外结果 .

示例:文本文件:

first line
second line

仅输出:

line
second

完全丢失文本文件的第一行 .

我的主要方法是:

#define MAX_STR_LEN 1024
int main(int argc, char** argv)
{
  FILE *fptr;
  fptr = fopen(argv[1], "r");

  if(fptr == NULL)
  {
   printf("Error. Could not open file.\n");
   exit(1);
   }

  char line[MAX_STR_LEN];
  char* tok;
  struct BSTnode* theRoot;
  int isRoot = 1;

  while(fgets(line, MAX_STR_LEN, fptr) != NULL)
  {
    tok = strtok(line, " \n");


    while(tok != NULL)
    {
      if(isRoot == 1)
      {
        theRoot = createNode(tok); //creates the root for the BST
         isRoot = 0;
      }
      else
      {
           processStr(&theRoot, tok); //places a new word into the BST
      }

      tok = strtok(NULL, " \n");
    }

  }

  inorder(theRoot); //prints words alphabetically
  fclose(fptr);
  return 0;
}

我介绍了GDB,当在while循环中第二次调用fgets时,BST的根被更改并覆盖 . 任何意见,将不胜感激 .

编辑:

struct BSTnode* createNode(char* word) 
{
    struct BSTnode* temp = malloc(sizeof(struct BSTnode));
    temp->word = word;
    temp->left = NULL;
    temp->right = NULL;
    return temp;
}

void processStr(struct BSTnode** root, char* word) 
{
    struct BSTnode** node = search(root, word);
    if (*node == NULL) {
        *node = createNode(word);
    }
}

struct BSTnode** search(struct BSTnode** root, char* word) {
    struct BSTnode** node = root;
    while (*node != NULL) {
        int compare = strcasecmp(word, (*node)->word);
        if (compare < 0)
            node = &(*node)->left;
        else if (compare > 0)
            node = &(*node)->right;
        else
            break;
    }
    return node;
 }

1 回答

  • 2

    您需要复制 createNode() 中的单词,尝试以下方法:

    struct BSTnode* createNode(char* word) 
    {
        struct BSTnode* temp = malloc(sizeof(struct BSTnode));
        temp->word = malloc(strlen(word) + 1);
        strcpy(temp->word, word);
        temp->left = NULL;
        temp->right = NULL;
        return temp;
    }
    

    createNode() 中, wordline 中指向子字符串的指针,对 fgets() 的另一次调用将覆盖此数组的内容 .

相关问题