nixp.ru v3.0

17 января 2017,
вторник,
03:53:36 MSK

Аутсорсинг Linux с компанией «Флант»
Fatal написал 2 августа 2004 года в 22:34 (453 просмотра) Ведет себя как мужчина; открыл 123 темы в форуме, оставил 484 комментария на сайте.

Мне необходимо отсортировать файлы в каталоге, как это делает команда ls. Загвоздка состоит в получении имен файлов в каталоге. Есть ли какая-нибудь функция, которая бы возвращала указатель на массив имен файлов, находящихся в заданном каталоге или что-то типа этого? Не очень удобно, да и не очень быстро, если читать функцией readdir и вытаскивать поле d_name из структуры direct, так как при этом нужно создавать динамически растущий массив строк, или заранее подсчитать количество файлов в директории и создать массив, затем все имена копировать в созданный массив — это как-то не хорошо, накладно я бы даже сказал. И только потом сортировать…

Берешь связанный список и сортируешь при вставке. Дешево и сердито.

vnp

man scandir

Fatal

>Берешь связанный список и сортируешь при вставке. Дешево и сердито.

я посмотерел вариант scandir, и мне бы хотелось узнать вариант со связанным списком.

cebka, вы бы не могли пояснить, что вы имеете в виду под связанным списком.

Fatal

Возрадовался я функции scandir — она и список выдает и сортирует, но по видимому зря. Передал я функцию для сравнения, при запуске программы сортировка вышла кривовато. Это глюк или я что-то неправильно делаю? (у меня FreeBSD 5.2.1).

Вот коротенька рабочая программа, которая выводит отсортированный список файлов в текущем каталоге:

#include

#include

#include

int compare(const void*a,const void*b){

struct dirent *aa=(struct dirent*)a,*bb=(struct dirent*)b;

return strcmp(bb->d_name,aa->d_name);

}

int main(void){

struct dirent**dir;

int num=scandir(«.»,&dir,NULL,compare);

while(num—)

puts(dir[num]->d_name);

free(dir);

return 0;

}

vnp
Fatal

struct dirent *aa=(struct dirent*)a,*bb=(struct dirent*)b;
      return strcmp(bb->d_name,aa->d_name);



struct dirent **aa=(struct dirent**)a,**bb=(struct dirent**)b;
      return strcmp((*bb)->d_name,(*aa)->d_name);
Fatal

Спасибо!

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.