I am currently creating a personal diary in C and I'd like to have the possibility to print the post sorted by date. I can extract the date using the struct tm but I don't know to sort the dates so that the most recent is on top. This is my whole function here :
void dateOrder() {
FILE *postfile = fopen("post.txt", "r");
int numofpost = getNumOfPost(postfile);
int dates[numofpost];
struct tm ptime;
char *elt = malloc(5 * sizeof(char));
char *dref = "Date";
char *href = "Heure";
char c = 'c';
char *pseudo = malloc(20 * sizeof(char));
int pseudolen = 0;
rewind(postfile);
while (!feof(postfile)) {
fscanf(postfile, "%s", elt);
if (strcmp(elt, dref) == 0) {
fseek(postfile, 3, SEEK_CUR);
fscanf(postfile, "%d/%d/%d", (int)&(ptime.tm_mday), (int)&(ptime.tm_mon), (int)&(ptime.tm_year));
}
if (strcmp(elt, href) == 0) {
fseek(postfile, 3, SEEK_CUR);
fscanf(postfile, "%d:%d", (int)&(ptime.tm_hour), (int)&(ptime.tm_min));
}
ptime.tm_year -= 1900;
ptime.tm_mon -= 1;
ptime.tm_sec = 0;
ptime.tm_isdst = -1;
int rep = mktime(&ptime);
if (rep != -1) {
dates[i++] = rep;
}
}
insertsort(dates, sizeof(dates)/sizeof(dates[0]));
for (int i = 0; i < numofpost; i++) {
c = 'c';
rewind(postfile);
while (!feof(postfile) && c != 24) {
fscanf(postfile, "%s", elt);
if (strcmp(elt, "Pseudo") == 0) {
fseek(postfile, 3, SEEK_CUR);
fscanf(postfile, "%s", pseudo);
pseudolen = strlen(pseudo);
}
if (strcmp(elt, dref) == 0) {
fseek(postfile, 3, SEEK_CUR);
fscanf(postfile, "%d/%d/%d", (int)&(ptime.tm_mday), (int)&(ptime.tm_mon), (int)&(ptime.tm_year));
}
if (strcmp(elt, href) == 0) {
fseek(postfile, 3, SEEK_CUR);
fscanf(postfile, "%d:%d", (int)&(ptime.tm_hour), (int)&(ptime.tm_min));
}
ptime.tm_year -= 1900;
ptime.tm_mon -= 1;
ptime.tm_sec = 0;
ptime.tm_isdst = -1;
int mkt = mktime(&ptime);
if (mkt == dates[i]) {
fseek(postfile, -39, SEEK_CUR);
fseek(postfile, -pseudolen, SEEK_CUR);
while (c != 24) {
c = fgetc(postfile);
if (c == 24)
continue;
printf("%c", c);
}
}
}
}
fclose(postfile);
}
And this is struct tm :
struct tm {
int tm_sec; /* seconds, range 0 to 59 */
int tm_min; /* minutes, range 0 to 59 */
int tm_hour; /* hours, range 0 to 23 */
int tm_mday; /* day of the month, range 1 to 31 */
int tm_mon; /* month, range 0 to 11 */
int tm_year; /* The number of years since 1900 */
int tm_wday; /* day of the week, range 0 to 6 */
int tm_yday; /* day in the year, range 0 to 365 */
int tm_isdst; /* daylight saving time */
};