Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 按ascii顺序对文件排序_Sorting_Ascii_Dirent.h - Fatal编程技术网

Sorting 按ascii顺序对文件排序

Sorting 按ascii顺序对文件排序,sorting,ascii,dirent.h,Sorting,Ascii,Dirent.h,我试图编写一个简单的函数来对目录的内容进行排序。问题是,它是按字母顺序出现的,不分大小写。我想按ASCII顺序对这些内容进行排序 示例:我得到了4个文件,名为Art、boat、Cat和驴子。我的实际代码按照这个顺序对它们进行排序,而我想得到艺术品、猫、船和驴 void list_dir(char *str){ DIR *rep = NULL; struct dirent* read_file = NULL; rep = opendir(str); if (!rep) { ft_p

我试图编写一个简单的函数来对目录的内容进行排序。问题是,它是按字母顺序出现的,不分大小写。我想按ASCII顺序对这些内容进行排序

示例:我得到了4个文件,名为Art、boat、Cat和驴子。我的实际代码按照这个顺序对它们进行排序,而我想得到艺术品、猫、船和驴

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');
    }
}
}通常根本不排序,它按目录顺序列出条目。如果列表已排序,则文件创建时已排序,或者操作系统对其排序

为了自己对输出进行排序,请将名称列表放入数组中,然后使用和对其进行排序


或者,只需通过管道传输输出。请确保
LC\u排序规则
环境变量设置正确。例如,运行
/yourprogram |(unset LC_ALL;LC_CTYPE=en_US.UTF-8 LC_COLLATE=C sort)

,使用用户定义的过滤器和比较器调用scandir,这是一个简单的解决方案。代码如下:

#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);
}

分拣在哪里进行?看起来您只是在读取目录并按原样打印。另外,在
之前需要一个
else
,而
我不知道,事情是,它似乎是自动的,我刚刚写了这个,结果它对读取的内容进行了排序,这是因为无论你在哪个操作系统上,都可能对其目录内容进行排序。您需要将它们读入并排序,然后再打印。请查看
stdlib.h
中的
qsort
。那就可以了。
$ 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]