按ascii顺序排序文件

时间:2013-12-09 16:37:50

标签: sorting ascii dirent.h

我正在尝试编写一个简单的函数来对目录的内容进行排序。事情是,它按字母顺序排列,无论是大写还是小写。我想按ASCII顺序对这些内容进行排序。

示例:我有4个文件,名为Art,boat,Cat和donkey。我的实际代码按此顺序排序,而我想要艺术,猫,船和驴。

void    list_dir(char *str){
DIR *rep = NULL;
struct dirent* read_file = NULL;

rep = opendir(str);
if (!rep)
{
    ft_putstr("ft_ls: ");
    perror(str);
    ft_putchar('\n');
}
while((read_file = readdir(rep)) != NULL)
{
    if (read_file->d_name[0] != '.')
    {
        ft_putstr(read_file->d_name);
        ft_putchar('\n');
    }
}

}

2 个答案:

答案 0 :(得分:0)

readdir(3)通常不排序,它按目录顺序列出条目。如果列表已排序,则文件是按顺序创建的,或者操作系统对它们进行排序。

为了自己对输出进行排序,请将名称列表放入一个数组中,然后对其进行排序,例如:使用qsort(3)strcmp(3)

或者,只需通过sort(1)管道输出。确保LC_COLLATION环境变量设置正确。例如,运行./yourprogram | (unset LC_ALL; LC_CTYPE=en_US.UTF-8 LC_COLLATE=C sort)

答案 1 :(得分:0)

通过用户定义的过滤器&调用 scandir 比较器是一个简单的解决方案imho。这是代码:

#include <dirent.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

static int my_dir_filter(const struct dirent* dir);
static int my_dir_comparator(const struct dirent**, const struct dirent**);

int main(int argc, char* const* argv) {
    struct dirent** ent_list_ = NULL;
    int r = scandir(".", &ent_list_, my_dir_filter, my_dir_comparator);
    for (int i = 0; i < r; ++i)
        printf("No. %-3d [%s]\n", i + 1, ent_list_[i]->d_name);
    for (int i = 0; i < r; ++i)
        free(ent_list_[i]);
    free(ent_list_);
    return r < 0 ? 1 : 0;
}

int my_dir_filter(const struct dirent* dir) {
    return (dir->d_type == DT_REG) ? 1 : 0;
}

int my_dir_comparator(const struct dirent** lhs, const struct dirent** rhs) {
    return strcasecmp((*lhs)->d_name, (*rhs)->d_name);
}

测试结果:

$ ls|LANG=C sort   ## in ASCII order
Art
Cat
boat
donkey
$ ../a.out         ## in my_dir_comparator order
No. 1   [Art]
No. 2   [boat]
No. 3   [Cat]
No. 4   [donkey]