сохранить список файлов в массив или что-то еще C

У меня есть эта функция

void file_listing(){ DIR *dp; struct stat fileStat; struct dirent *ep; int file=0; dp = opendir ("./"); if (dp != NULL){ while ((ep = readdir(dp))){ char *c = ep->d_name; char d = *c; /* first char */ if((file=open(ep->d_name,O_RDONLY)) d_name); } else{ continue; /* altrimenti non lo listo */ } } } (void) closedir (dp); } else{ perror ("Impossibile aprire la directory"); return 1; } } 

Я хочу сохранить в массив или структуру или список или что-то еще результат списка файлов, но я не знаю, как это сделать.
Заранее спасибо!

Вот примерная функция, которая хранит список файлов в массиве и возвращает количество записей:

 #include  #include  #include  #include  size_t file_list(const char *path, char ***ls) { size_t count = 0; size_t length = 0; DIR *dp = NULL; struct dirent *ep = NULL; dp = opendir(path); if(NULL == dp) { fprintf(stderr, "no such directory: '%s'", path); return 0; } *ls = NULL; ep = readdir(dp); while(NULL != ep){ count++; ep = readdir(dp); } rewinddir(dp); *ls = calloc(count, sizeof(char *)); count = 0; ep = readdir(dp); while(NULL != ep){ (*ls)[count++] = strdup(ep->d_name); ep = readdir(dp); } closedir(dp); return count; } int main(int argc, char **argv) { char **files; size_t count; int i; count = file_list("/home/rgerganov", &files); for (i = 0; i < count; i++) { printf("%s\n", files[i]); } } 

Обратите внимание, что я повторяю дважды по каталогу - первый раз, чтобы получить количество файлов и второй раз, чтобы сохранить результаты. Это не будет работать, если вы добавите / удалите файлы в каталоге во время его выполнения.

Другой пример, более чистый, но не streamобезопасный, поскольку readdir() не является:

 #include  #include  #include  #include  #include  #include  static void *realloc_or_free(void *ptr, size_t size) { void *tmp = realloc(ptr, size); if (tmp == NULL) { free(ptr); } return tmp; } static int get_dirent_dir(char const *path, struct dirent **result, size_t *size) { DIR *dir = opendir(path); if (dir == NULL) { closedir(dir); return -1; } struct dirent *array = NULL; size_t i = 0; size_t used = 0; struct dirent *dirent; while ((dirent = readdir(dir)) != NULL) { if (used == i) { i += 42; // why not? array = realloc_or_free(array, sizeof *array * i); if (array == NULL) { closedir(dir); return -1; } } array[used++] = *dirent; } struct dirent *tmp = realloc(array, sizeof *array * used); if (tmp != NULL) { array = tmp; } *result = array; *size = used; closedir(dir); return 0; } static int cmp_dirent_aux(struct dirent const *a, struct dirent const *b) { return strcmp(a->d_name, b->d_name); } static int cmp_dirent(void const *a, void const *b) { return cmp_dirent_aux(a, b); } int main(void) { struct dirent *result; size_t size; if (get_dirent_dir(".", &result, &size) != 0) { perror("get_file_dir()"); } qsort(result, size, sizeof *result, &cmp_dirent); for (size_t i = 0; i < size; i++) { printf("%s\n", result[i].d_name); } free(result); }