2013-12-09 114 views
0

我想編碼一個簡單的函數來排序目錄的內容。事情是,它按字母順序排列,無論大寫還是小寫。我想按ASCII順序對這些內容進行排序。按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'); 
    } 
} 

}

+0

哪裏排序發生了什麼?它看起來像你只是讀一個目錄並按原樣打印。另外,你需要一個'前else'了'while' –

+0

我不knoz,事情是,它似乎是自動的,我只是寫了這一點,它變成了排序不管它讀 –

+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)

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]