codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
#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; }
Private
[
?
]
Run code
Submit