title: C fgets() only handling last line
body: <p>I am trying to write a program that takes in a .txt file, reads all the lines, then stores each word into a BST. I then perform an inorder traversal to print the words in alphabetical order. The program works perfectly if the text file  contains only 1 line, but if the text file has more than 1 line there are unexpected results. </p>
  
  <p>Example: the text file:</p>
  
  <pre><code>first line
  second line
  </code></pre>
  
  <p>Outputs only:</p>
  
  <pre><code>line
  second
  </code></pre>
  
  <p>Completely losing the first line of the text file.</p>
  
  <p>My main method is:</p>
  
  <pre><code>#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(&amp;theRoot, tok); //places a new word into the BST
        }
  
        tok = strtok(NULL, " \n");
      }
  
    }
  
    inorder(theRoot); //prints words alphabetically
    fclose(fptr);
    return 0;
  }
  </code></pre>
  
  <p>I stepped through with GDB and when fgets is called for the second time in the while loop, theRoot of the BST is changed and overwritten. Any advice would be appreciated.</p>
  
  <p>EDIT:</p>
  
  <pre><code>struct BSTnode* createNode(char* word) 
  {
      struct BSTnode* temp = malloc(sizeof(struct BSTnode));
      temp-&gt;word = word;
      temp-&gt;left = NULL;
      temp-&gt;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)-&gt;word);
          if (compare &lt; 0)
              node = &amp;(*node)-&gt;left;
          else if (compare &gt; 0)
              node = &amp;(*node)-&gt;right;
          else
              break;
      }
      return node;
   }
  </code></pre>