[ create a new paste ] login | about

Link: http://codepad.org/9mCtwD1V    [ raw code | fork ]

C, pasted on Apr 17:
#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;
}


Create a new paste based on this one


Comments: