Цикл fgets работает правильно, только если строка снова является malloc'd в конце цикла - PullRequest
0 голосов
/ 27 марта 2019

Мне нужно прочитать строки из файла через запятую, разбить аргументы между этими запятыми и обработать их соответствующим образом.У меня следующий код, настроенный для выполнения именно того, что мне нужно:

char *string = malloc(MAX_INPUT);
char * current_parent;
char * current_child;
// while there are still lines to read from the file
while(fgets(string, BUFF_SIZE, file) != NULL){
          // get the parent of a line and its first child
          current_parent = trim(strtok(string, ","));

          if(strcmp(current_parent, "") != 0){

                 current_child = trim(strtok(NULL, ","));

                 if(current_child == NULL || strcmp(current_child, "") == 0){
                           tree = add_child(tree, current_parent, "");
                 }
                 else{
                           while(current_child != NULL){
                                  tree = add_child(tree, current_parent, current_child);
                                  current_child = trim(strtok(NULL, ","));
                           }
                 }
                 current_parent = 0;
                 current_child = 0;

         }
         string = (char *)malloc(MAX_INPUT);
}
// close the file
free(string);
fclose(file);

Пример файла:

john 1, sam 2
sam 2, ben 4, frances, sam 3
ben 4, sam 4, ben 5, nancy 2, holly
ben 5, john 2, sam 5

Все, что находится перед первой запятой, это имя родителя, и вседругие строки после этого - его дочерние имена.

Моя проблема в том, что по какой-то причине он правильно считывает данные только в том случае, если в конце цикла снова и снова используется строка.В дополнение к этому, если я попытаюсь освободить память до того, как malloc'ing снова будет работать, это не сработает, что приведет к утечкам памяти.Я даже пытался настроить цикл так, чтобы он просто использовал строку фиксированного размера, но он все равно затем читает эти перемешанные данные в конце.Я также попытался вручную очистить строку в конце каждого цикла.У меня есть ощущение, что я могу упускать из виду что-то действительно простое, но это сводит меня с ума.Дайте мне знать, могу ли я предоставить что-нибудь еще, что могло бы помочь.Спасибо.

Редактировать: Не уверен, важно ли это для чего-либо, но MAX_INPUT и BUFF_SIZE равны 1024

...