readdir 函數本身不提供自定義排序功能,它返回的目錄條目順序取決于底層文件系統。 要實現自定義排序,需要在讀取目錄后,使用程序代碼進行排序。
以下示例演示如何結合 readdir 和 qsort 對目錄中的文件名進行排序:
#include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <string.h> //比較函數,用于qsort int compare(const void *a, const void *b) { return strcmp(*(const char **)a, *(const char **)b); } int main() { DIR *dir; struct dirent *entry; char **filenames; // 使用char**動態分配內存,更靈活 int count = 0; int i; dir = opendir("."); if (dir == NULL) { perror("opendir"); return 1; } // 首先獲取目錄條目數量,以便動態分配內存 while ((entry = readdir(dir)) != NULL) { count++; } rewinddir(dir); // 重置目錄流指針 filenames = (char **)malloc(count * sizeof(char *)); if (filenames == NULL) { perror("malloc"); closedir(dir); return 1; } count = 0; // 重置計數器 while ((entry = readdir(dir)) != NULL) { if (entry->d_type == DT_REG) { // 只處理普通文件 filenames[count] = strdup(entry->d_name); if (filenames[count] == NULL) { perror("strdup"); // 處理內存分配失敗 for (i = 0; i < count; i++) { free(filenames[i]); } free(filenames); closedir(dir); return 1; } count++; } } closedir(dir); qsort(filenames, count, sizeof(char *), compare); for (i = 0; i < count; i++) { printf("%sn", filenames[i]); free(filenames[i]); // 釋放strdup分配的內存 } free(filenames); // 釋放filenames數組的內存 return 0; }
此代碼首先使用 readdir 讀取目錄中的所有條目,然后使用 qsort 進行排序,最后打印排序后的文件名并釋放所有動態分配的內存,避免內存泄漏。 改進之處在于動態分配內存,避免了固定大小數組的限制,并添加了錯誤處理和內存釋放。 記住編譯時需要鏈接 -lm (用于 malloc 和 free)。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END