我正在尝试根据最新的st_mtime对目录列表进行排序,但无法弄清楚如何准确排序我正在分配的结构数组。如何根据最近的日期对结构进行排序?...这是我目前的方法:
static int cmpstringp(const void *p1, const void *p2){
return strcmp(* (char * const *) p1, * (char * const *) p2);
}
struct directoryStat dStat{
char name[50];
char time[50];
};
int main(){
i = 0;
while ((ep = readdir(dp))){
stat(ep->d_name, &fileStat);
strcpy(dStat[i].name, ep->d_name);
strcpy(dStat[i].time, ctime(&fileStat.st_mtime));
i++;
}
}
qsort(dStat, i, sizeof(char), cmpstringp);
根据字符串表示形式对时间(或日期时间(值进行排序可能不是一个好主意,因为这种基于日期/时间值的可能依赖于本地化的字符串表示的(字典(顺序可能与时间顺序不对应(例如,参见David C. Rankin的评论(。我会存储和比较原始time_t
值。
请参阅以下代码,其中演示了按字符串值排序和按time_t
-value 排序。希望对您有所帮助!
typedef struct directoryStat {
char name[50];
char timeStr[50];
time_t timeVal;
}dStat;
int cmpDStatTimeStr(const void *p1, const void *p2){
return strcmp( ((dStat*)p1)->timeStr, ((dStat*)p2)->timeStr);
}
int cmpDStatTimeVal(const void *p1, const void *p2){
return ((dStat*)p1)->timeVal > ((dStat*)p2)->timeVal;
}
int main(){
dStat stat[2] = { { "the former", "2017/5/2", 14500000 }, { "the latter","2017/5/12", 14500001 }};
// sort based on string value (lexigraphical comparison):
qsort(stat, 2, sizeof(dStat), cmpDStatTimeStr);
// sort based on time value directly:
qsort(stat, 2, sizeof(dStat), cmpDStatTimeVal);
return 0;
}