Sorting 按ascii顺序对文件排序
我试图编写一个简单的函数来对目录的内容进行排序。问题是,它是按字母顺序出现的,不分大小写。我想按ASCII顺序对这些内容进行排序 示例:我得到了4个文件,名为Art、boat、Cat和驴子。我的实际代码按照这个顺序对它们进行排序,而我想得到艺术品、猫、船和驴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
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]