home *** CD-ROM | disk | FTP | other *** search
/ PC-X 1998 July / pcx23_9807.iso / PC-XUSER / PC-XUSER.16 / ABC / TK2.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-05  |  10.4 KB  |  443 lines

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5. #include <malloc.h>
  6. #include "keydef.h"
  7. #include "screen.h"
  8.  
  9. #define DATAFILE  "tk.dat"
  10. #define INDEXFILE "tk.ndx"
  11. #define MAXDAT 10000        //Max 10000 telefonszam  (remelem mindenkinek eleg)
  12.                             //tobb is lehetne mondjuk nagyobb memoriamodellben
  13.  
  14. #define PAGE 22
  15.  
  16.   typedef struct {
  17.                    char   nev[30];
  18.                    char   szam[15];
  19.                    char   cim[30];
  20.                    char   reserved;
  21.                  } DATTYPE;
  22.  
  23.   typedef unsigned short int NDXTYPE;
  24.  
  25. FILE *datfile;
  26. FILE *ndxfile;
  27. NDXTYPE *ndx;
  28. unsigned int records;
  29.  
  30. long filelength(FILE *file);
  31. int insertndx(int recordnum, DATTYPE rekord);
  32. void deletendx(int x);
  33. int search(char *nev,int *poz);      //kereses rendezett adatbazisban
  34. void fill(DATTYPE *rek);
  35.  
  36. void main(void)
  37. {
  38.  char c, srchstr[30]="";
  39.  int srchstrpos=0,poz=0,oldpoz=-1,exit=0;
  40.  unsigned int seg;
  41.  void init(void);
  42.  void insert();
  43.  void list(int poz);
  44.  void change(int poz);
  45.  void del(int poz);
  46.  void undelete(void);
  47.  void recoverndx(void);
  48.  int kilep(void);
  49.  int checkndx();
  50.  int checkdat();
  51.  int openfile(FILE **file,char *filename);
  52.  void freshsrch(char *c);
  53.  
  54.  clrscr();
  55.  if (openfile(&datfile,DATAFILE) && openfile(&ndxfile,INDEXFILE))
  56.  {
  57.   if (!checkdat()) { printf("Hibas az adatfile, nem tudom kezelni, szia");return ;}
  58.   if ((ndx=(NDXTYPE *)malloc(MAXDAT*sizeof(NDXTYPE)))==0)  //ndx erre mutat
  59.         {printf("Nem ferek el a memoriaban");return;}
  60.   if (!checkndx())
  61.   {
  62.    printf("Az indexfile nem oksi. Kijavítom...\n");
  63.    recoverndx();
  64. //   bill();
  65.   }
  66.   fread(ndx,sizeof(NDXTYPE),records,ndxfile);    //indexfile be
  67.   fclose(ndxfile);                               //mar a memoriaban van
  68.  
  69.   init();
  70.  
  71.   do
  72.   {
  73.    if (srchstrpos>0) search(srchstr,&poz);
  74.    if (oldpoz!=poz) list(poz);
  75.    freshsrch(srchstr);
  76.    oldpoz=poz;
  77.    c=getch();
  78.    switch(c)
  79.    {
  80.     case 0: c=getch();
  81.             switch(c)
  82.             {
  83.                 case INS   : insert(); oldpoz=-1; break;
  84.                 case DEL   : del(poz);oldpoz=-1; break;
  85.                 case DOWN : poz++;if (poz>=records) poz=records-1;srchstr[0]=0;srchstrpos=0;break;
  86.                 case UP :   poz--;if (poz<0) poz=0;srchstr[0]=0;srchstrpos=0;break;
  87.                 case PGUP : poz-=PAGE;if (poz<0) poz=0;srchstr[0]=0;srchstrpos=0;break;
  88.                 case PGDN : poz+=PAGE;if (poz>=records) poz=records-1;srchstr[0]=0;srchstrpos=0;break;
  89.                 case HOME : poz=0;srchstr[0]=0;srchstrpos=0;break;
  90.                 case END :  poz=records-1;srchstr[0]=0;srchstrpos=0;break;
  91.             } break;
  92.     case ESC : exit=kilep();break;
  93.     case ENTER : change(poz);oldpoz=-1; break;
  94.     case CTRLBS : undelete();oldpoz=-1;break;
  95.     case BS : if (srchstrpos>0) srchstrpos--;
  96.                      srchstr[srchstrpos]=0;
  97.                      break;
  98.  
  99.     default: srchstr[srchstrpos]=c;
  100.              if (srchstrpos<29) srchstrpos++;
  101.              break;
  102.    }
  103.   } while(!exit);
  104.  
  105.  
  106.   fclose(datfile);
  107.   //indexfile elmentese
  108.   ndxfile=fopen(INDEXFILE,"wb");
  109.   fwrite(ndx, sizeof(NDXTYPE), records, ndxfile);
  110.   fclose(ndxfile);
  111.  }
  112. }  // main
  113.  
  114. void freshsrch(char *c)
  115. {
  116.  gotoxy(50,24);
  117.  textcolor(WHITE);
  118.  textbackground(CYAN);
  119.  cprintf("                              ");
  120.  gotoxy(50,24);
  121.  cprintf("%s",c);
  122. }
  123.  
  124. int kilep(void)
  125. {
  126.  if (mnuwin(20,10,40,13,"Kilépsz ?",2,
  127.         "Igen",
  128.         "Nem")==0) return(1);
  129.  return(0);
  130. }
  131.  
  132.  
  133. void init(void)
  134. {
  135.  screeninit();
  136.  screentitle("TelKony V0.0");
  137.  textbackground(CYAN);
  138.  textcolor(BLACK);
  139.  gotoxy(1,2);
  140.  cprintf("   Név                        Telefonszám                     Lakcím            ");
  141.  screenhelp("Uj szám : Insert    Töröl     : Del      Keresô:[                              ]\n\
  142. Módosít : Enter                                                      Kilép : ESC");
  143. // screenhelp("");
  144. }
  145.  
  146. void list(int poz)
  147. {
  148.  DATTYPE rek;
  149.  char sor[81];
  150.  int i,y;
  151.  
  152.  textbackground(BLUE);
  153.  textcolor(BLACK);
  154.  
  155.  for(i=3;i<24;i++)
  156.  {
  157.   gotoxy(1,i);
  158.   clreol();
  159.  }
  160.  
  161.  y=3;
  162.  i=poz-PAGE/2;
  163.  while(i<poz+PAGE/2-1)
  164.  {
  165.   if (i>=0 && i<records)
  166.   {
  167.    fseek(datfile,(long) ndx[i]*sizeof(DATTYPE),SEEK_SET);
  168.    fread(&rek,sizeof(DATTYPE),1,datfile);
  169.    if (i==poz)
  170.    {
  171.     textbackground(CYAN);
  172.     textcolor(BLACK);
  173.    } else
  174.    {
  175.     textbackground(BLUE);
  176.     textcolor(BLACK);
  177.    }
  178.    memset(sor,' ',80);
  179.    sor[80]=0;
  180.    memcpy(&sor[0],rek.nev,strlen(rek.nev));
  181.    memcpy(&sor[40-strlen(rek.szam)],rek.szam,strlen(rek.szam));
  182.    memcpy(&sor[80-strlen(rek.cim)],rek.cim,strlen(rek.cim));
  183.    gotoxy(1,y);
  184.    cprintf("%s",sor);
  185.   }
  186.   i++;
  187.   y++;
  188.  }
  189. }
  190.  
  191. void insert()
  192. {
  193.  DATTYPE rek;
  194.  
  195.  memset (&rek, 0, sizeof(DATTYPE));
  196.  
  197.  fill(&rek);
  198.  rek.reserved=0;
  199.  
  200.  if ( edtwin(20,10,60,14,"Uj szám",3,
  201.         "Név  :",rek.nev,
  202.         "Szám :",rek.szam,
  203.         "Cím  :",rek.cim))
  204.  {
  205.  
  206.   fseek(datfile,0,SEEK_END);
  207.   if (insertndx(ftell(datfile)/sizeof(DATTYPE),rek))
  208.   {
  209.    fwrite(&rek, sizeof(DATTYPE), 1, datfile);
  210.    records++;
  211.   } else msgwin("Ilyen név már van!");
  212.  }
  213. }
  214.  
  215. void change(int pos)
  216. {
  217.  DATTYPE rek,rek0;
  218.  int p,recordnum;
  219.  
  220.  fseek(datfile,(long) ndx[pos]*sizeof(DATTYPE),SEEK_SET);
  221.  fread(&rek,sizeof(DATTYPE),1,datfile);
  222.  
  223.  fill(&rek);
  224.  memcpy (&rek0, &rek, sizeof(DATTYPE));
  225.  
  226.  if(edtwin(20,10,60,14,"Módosítás",3,
  227.         "Név  :",rek0.nev,
  228.         "Szám :",rek0.szam,
  229.         "Cím  :",rek0.cim))
  230.  {
  231.   if (strcmp(rek.nev,rek0.nev)!=0 && search(rek0.nev,&p)) msgwin("Ilyen nev mar van.");
  232.   else
  233.   {
  234.    recordnum=ndx[pos];
  235.    deletendx(pos);
  236.    records--;
  237.    insertndx(recordnum,rek0);
  238.    records++;
  239.    fseek(datfile,(long) recordnum*sizeof(DATTYPE),SEEK_SET);
  240.    fwrite(&rek0, sizeof(DATTYPE), 1, datfile);
  241.   }
  242.  }
  243. }   // modositas
  244.  
  245. void del(int pos)
  246. {
  247.  DATTYPE rek;
  248.  
  249.  if (mnuwin(35,10,45,13,"Töröljem?",2,"Igen","Nem")==0)
  250.  {
  251.   fseek(datfile,(long) ndx[pos]*sizeof(DATTYPE),SEEK_SET);
  252.   fread(&rek,sizeof(DATTYPE),1,datfile);
  253.   rek.reserved=1;
  254.   fseek(datfile,(long) ndx[pos]*sizeof(DATTYPE),SEEK_SET);
  255.   fwrite(&rek,sizeof(DATTYPE),1,datfile);
  256.   deletendx(pos);
  257.   records--;
  258.  }
  259. }
  260.  
  261. void undelete(void)
  262. {
  263.  DATTYPE rek,rek2;
  264.  int p,found=0,pos;
  265.  
  266.  memset(&rek2,0,sizeof(rek2));
  267.  fill(&rek2);
  268.  
  269.  if(edtwin(20,10,60,12,"Törles vissza",1,"Név  :",rek2.nev))
  270.  {
  271.   fseek(datfile,0,SEEK_SET);
  272.   while (!feof(datfile) && !found)
  273.   {
  274.    if (fread(&rek,sizeof(DATTYPE),1,datfile) && rek.reserved==1 && strcmp(rek.nev,rek2.nev)==0)
  275.    {
  276.     found=1;
  277.     if (search(rek2.nev,&pos)) msgwin("Nem lehet visszaallitani, mar letezik aznos nevu.");
  278.     else
  279.     {
  280.      fseek(datfile,SEEK_CUR,-sizeof(DATTYPE));
  281.      rek.reserved=0;
  282.      insertndx(ftell(datfile)/sizeof(DATTYPE),rek);
  283.      records++;
  284.      fwrite(&rek,sizeof(DATTYPE),1,datfile);
  285.     }
  286.    }
  287.   }
  288.   if (!found) msgwin("Nem talaltam.");
  289.  }
  290. }
  291.  
  292. int openfile(FILE **file,char *filename)
  293. {
  294.  if ((*file=fopen(filename,"r+b"))==NULL)
  295.  {
  296.   printf("A %s file nem letzik, letrehozom...\n",filename);
  297. //  bill();
  298.   if ((*file=fopen(filename,"wb"))==NULL)
  299.   {
  300.    printf("Nem tudom letrehozni a %s file-t (lehet hogy CD-rol inditottal)\n",filename);
  301. //   bill();
  302.    return(0);
  303.   }
  304.   fclose(*file);
  305.   *file=fopen(filename,"r+b");
  306.  }
  307.  return(1);
  308. }
  309.  
  310. int checkdat()
  311. {
  312.  DATTYPE rek;
  313.  
  314.  if (filelength(datfile)%sizeof(DATTYPE)!=0) return(0);
  315.  records=0;
  316.  fseek(datfile,0,SEEK_SET);
  317.  while (!feof(datfile))
  318.  {
  319.   if (fread(&rek,sizeof(DATTYPE),1,datfile) && rek.reserved==0) records++;
  320.  }
  321.  return(1);
  322. }
  323.  
  324. int checkndx()
  325. {
  326.  return((filelength(ndxfile)/sizeof(NDXTYPE))==records);
  327. }
  328.  
  329. void recoverndx()
  330. {
  331.  int r;
  332.  DATTYPE rek;
  333.  FILE *dat2file;
  334.  
  335.  fclose(datfile);
  336.  rename(DATAFILE, "$$.DAT");        //TEMP FILE
  337.  dat2file=fopen("$$.DAT","rb");
  338.  datfile=fopen(DATAFILE,"wb");
  339.  fclose(datfile);
  340.  datfile=fopen(DATAFILE,"r+b");
  341.  fseek(dat2file,0,SEEK_SET);
  342.  
  343.  r=records;
  344.  for(records=0;records<r;)
  345.  {
  346.   fread(&rek,sizeof(DATTYPE),1,dat2file);
  347.   if (rek.reserved==0)
  348.   {
  349.    insertndx(ftell(dat2file)/sizeof(DATTYPE)-1,rek);
  350.    records++;
  351.   }
  352.   fseek(datfile,0,SEEK_END);
  353.   fwrite(&rek,sizeof(DATTYPE),1,datfile);
  354.  }
  355.  records=r;
  356.  fseek(ndxfile,0,SEEK_SET);
  357.  fwrite(ndx, sizeof(NDXTYPE), records, ndxfile);
  358.  fseek(ndxfile,0,SEEK_SET);
  359.  
  360.  remove("$$.DAT");
  361. }
  362.  
  363. int insertndx(int recordnum, DATTYPE rekord)
  364. {
  365.  int poz,i=0;
  366.  
  367.  if (search(rekord.nev,&poz)) return(0);
  368.  for(i=records;i>poz;i--) ndx[i]=ndx[i-1];  //arreb pakoljuk az indexeket
  369.  ndx[poz]=recordnum;                        //benyomjuk az ujat
  370.  return(1);
  371. }
  372.  
  373. int search(char *nev,int *poz)      //kereses rendezett adatbazisban
  374. {
  375.  int i=0,h,hl,ll,found=0;
  376.  long oldpos;
  377.  DATTYPE rek;
  378.  
  379.  if (!records) {*poz=0;return(0);}  //ha nincs meg elem
  380.  
  381.  oldpos=ftell(datfile);
  382.  //intervallum vegpontjai
  383.  ll=0;
  384.  hl=records-1;
  385.  
  386.  //benn van e az intervallumban:
  387.  fseek(datfile,(long) ndx[ll]*sizeof(DATTYPE),SEEK_SET);
  388.  fread(&rek,sizeof(DATTYPE),1,datfile);
  389.  if (strcmp(nev,rek.nev)==0) {*poz=0;fseek(datfile,oldpos,SEEK_SET);return(1);}
  390.  if (strcmp(nev,rek.nev)<0) {*poz=0;fseek(datfile,oldpos,SEEK_SET);return(0);}
  391.  if (strcmp(nev,rek.nev)>0)
  392.  {
  393.   fseek(datfile,(long) ndx[hl]*sizeof(DATTYPE),SEEK_SET);
  394.   fread(&rek,sizeof(DATTYPE),1,datfile);
  395.   if (strcmp(nev,rek.nev)>0)  {*poz=records;fseek(datfile,oldpos,SEEK_SET);return(0);}
  396.   if (strcmp(nev,rek.nev)==0) {*poz=records-1;fseek(datfile,oldpos,SEEK_SET);return(1);}
  397.   if (strcmp(nev,rek.nev)<0 && records==2)  {*poz=1;fseek(datfile,oldpos,SEEK_SET);return(0);}
  398.  }
  399.  
  400.  //tutira benn van az intervallumban, ami legalabb 3 elemu
  401.  while(ll!=hl-1 && !found)
  402.  {
  403.   i=(ll+hl)/2;
  404.   fseek(datfile,(long) ndx[i]*sizeof(DATTYPE),SEEK_SET);
  405.   fread(&rek,sizeof(DATTYPE),1,datfile);
  406.   h=strcmp(nev,rek.nev);
  407.   if (h<0) hl=i;
  408.   if (h>0) ll=i;
  409.   if (h==0) found=1;
  410.  }
  411.  if (!found && h>0) i++;
  412.  *poz=i;
  413.  fseek(datfile,oldpos,SEEK_SET);
  414.  return(found);
  415. }
  416.  
  417. void deletendx(int x)
  418. {
  419.  int i;
  420.  for (i=x;i<records-1;i++)
  421.   ndx[i]=ndx[i+1];
  422. }
  423.  
  424. long filelength(FILE *file)
  425. {
  426.  long oldpos;
  427.  long size;
  428.  
  429.  oldpos=ftell(file);
  430.  fseek(file,0,SEEK_END);
  431.  size=ftell(file);
  432.  fseek(file,oldpos,SEEK_SET);
  433.  return(size);
  434. }
  435.  
  436. void fill(DATTYPE *rek)
  437. {
  438.  int n;
  439.  
  440.  for(n=strlen(rek->nev);n<30-1;rek->nev[n++]=' '); rek->nev[n]=0;
  441.  for(n=strlen(rek->cim);n<30-1;rek->cim[n++]=' '); rek->cim[n]=0;
  442.  for(n=strlen(rek->szam);n<15-1;rek->szam[n++]=' '); rek->szam[n]=0;
  443. }