尝试使用 ctime 从调用 stat 中对 c 中的结构数组进行排序



我正在尝试根据最新的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;
}

最新更新