Fatal
написал 2 августа 2004 года в 22:34 (1142 просмотра)
Ведет себя
как мужчина; открыл 123 темы в форуме, оставил 484 комментария на сайте.
Мне необходимо отсортировать файлы в каталоге, как это делает команда ls. Загвоздка состоит в получении имен файлов в каталоге. Есть ли какая-нибудь функция, которая бы возвращала указатель на массив имен файлов, находящихся в заданном каталоге или что-то типа этого? Не очень удобно, да и не очень быстро, если читать функцией readdir и вытаскивать поле d_name из структуры direct, так как при этом нужно создавать динамически растущий массив строк, или заранее подсчитать количество файлов в директории и создать массив, затем все имена копировать в созданный массив — это как-то не хорошо, накладно я бы даже сказал. И только потом сортировать…
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
Берешь связанный список и сортируешь при вставке. Дешево и сердито.
man scandir
>Берешь связанный список и сортируешь при вставке. Дешево и сердито.
я посмотерел вариант scandir, и мне бы хотелось узнать вариант со связанным списком.
cebka, вы бы не могли пояснить, что вы имеете в виду под связанным списком.
Возрадовался я функции 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;
}
Спасибо!