2015-02-22 3 views
1

Вот моя функция, которая ищет обычные файлы в данной директории, а затем сохраняет полный путь к ним в списке.Confustion с буфером realpath()

static my_func(const char *path, Files **list) //list - storage for file names 
{ 
    DIR *d; 
    struct dirent *dir; 
    char buf[PATH_MAX + 1]; 

    d = opendir(path); 
    if (d) { 
     while ((dir = readdir(d)) != NULL) { 
      if ((DT_REG == dir->d_type)) { 

       realpath(dir->d_name, buf); 
       List_push(list, buf); 
       printf("%s\n", dir->d_name); 
       // memset(buf, 0, PATH_MAX + 1); 
      } 
     } 
    } 
    closedir(d); 
    return 0; 
} 
... 
... 

int main() 
{ 
    // list creation 
    // my_func call 
    ... 
    List_print(...) 
} 

Ожидаемый результат:

FILE_1.txt 
FILE_2.txt 
FILE_3.txt 
FILE_4.txt 
FILE_5.txt 
/home/user/c/FILE_1.txt 
/home/user/c/FILE_2.txt 
/home/user/c/FILE_3.txt 
/home/user/c/FILE_4.txt 
/home/user/c/FILE_5.txt 

Выходной ток:

FILE_1.txt 
FILE_2.txt 
FILE_3.txt 
FILE_4.txt 
FILE_5.txt 
/home/user/c/FILE_1.txt 
/home/user/c/FILE_1.txt 
/home/user/c/FILE_1.txt 
/home/user/c/FILE_1.txt 
/home/user/c/FILE_1.txt 

Может ли это быть связано с моей реализацией связанного списка? Он отлично работает, потому что я тестировал его:

List_push(list, dir->d_name) 

и получил ожидаемые результаты. Это реализация List_push (файлы просто STRUCT с char * и указателем на следующий элемент):

void List_push(Files **head, char *x) 
{ 
    Files *new; 

    new = malloc(sizeof(Files)); 

    if (NULL != new) { 
     new->next = *head; 
     new->text = x; 
     *head = new; 
    } else { 
     printf("malloc error"); 
    } 

} 

Кроме того, как вы можете видеть, что я пытался очистить buf с MemSet, но без успеха - выход является:

FILE_1.txt 
FILE_2.txt 
FILE_3.txt 
FILE_4.txt 
FILE_5.txt 






[console]$ 

Да, пустое пространство, кажется, подается с чем-то (или это только '\n' символы из List_print), поэтому список не пуст.

Что здесь не так?

+2

Вам нужно сделать копию строки, чтобы вы не указали на переменную buf []. Рассмотрим strdup(). –

+0

И спасибо, Ханс :) – questionable

ответ

2

В List_push(list, buf); вы храните указатель на buf в списке. Вы делаете это для каждого файла, поэтому в итоге вы получаете несколько указателей на тот же номер buf. При печати элементов списка он отображает текущее содержимое buf.

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

+0

Хорошо, я постараюсь это сделать. Спасибо:) – questionable