#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define FILENAME "pass.txt"
#define FILENAME2 "pass2.txt"
#define MAXCOL 128
struct login {
time_t t;
char id[MAXCOL];
char pass[MAXCOL];
};
int comp(const void *l1, const void *l2);
int main(void)
{
int i, raw = 0;
FILE *fi, *fo;
char buf[MAXCOL];
struct login *logp, **logpp;
time_t tt;
if ((fi = fopen(FILENAME, "r")) == NULL)
exit(1);
while (1) {
if (fgets(buf, MAXCOL, fi) == NULL)
break;
raw++;
}
if ((logp = (struct login *)malloc(sizeof(struct login) * raw)) == NULL)
exit(1);
if ((logpp = (struct login **)malloc(sizeof(struct login *) * raw)) == NULL)
exit(1);
for (i = 0; i < raw; i++)
logpp[i] = &logp[i];
rewind(fi);
/* ファイルを読み込んでtime_tに変換する */
for (i = 0; i < raw; i++) {
struct tm t;
char *s;
if (fgets(buf, MAXCOL, fi) == NULL)
return(1);
s = buf;
t.tm_year = atoi(s) - 1900;
s += 5;
t.tm_mon = atoi(s) - 1;
s += 3;
t.tm_mday = atoi(s);
s += 4;
t.tm_hour = atoi(s);
s += 3;
t.tm_min = atoi(s);
s += 3;
t.tm_sec = atoi(s);
/* time_tに変換する */
logp[i].t = mktime(&t);
/* idとpassを読み取る */
s = buf + 22;
s = strtok(s, "<>");
strcpy(logp[i].id, s);
s = strtok(NULL, "<>\n");
strcpy(logp[i].pass, s);
}
fclose(fi);
/* time_tでソートする */
tt = time(NULL);
printf("ソートを開始します。\n");
qsort(logpp, raw, sizeof(struct login **), comp);
printf("%ld秒掛かりました。\n", time(NULL) - tt);
if ((fo = fopen(FILENAME2, "w")) == NULL)
exit(1);
for (i = 0; i < raw; i++) {
struct tm *tmp = localtime(&logpp[i]->t);
fprintf(fo, "%04d-%02d-%02d<>%02d:%02d:%02d<>%s<>%s\n",
tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday, tmp->tm_hour, tmp->tm_min, tmp->tm_sec, logpp[i]->id, logpp[i]->pass);
}
fclose(fo);
free(logpp);
free(logp);
return 0;
}
int comp(const void *l1, const void *l2)
{
time_t t1 = (*(struct login **)l1)->t, t2 = (*(struct login **)l2)->t;
if (t1 < t2)
return -1;
else if (t1 > t2)
return 1;
else
return 0;
}