Author: Not specified Language: c
Description: Not specified Timestamp: 2013-05-26 15:56:23 +0000
View raw paste Reply
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. // ?????????
  5. const int SIZE = 20;
  6. const char *msgs[]={"0. End","1. Add Item", "2. Find Items", "3. Delete Items", "4. Show Table"};
  7. const int Nmsgs = sizeof(msgs)/sizeof(msgs[0]);
  8.  
  9. typedef struct Item
  10. {
  11.     int key;
  12.     int release;
  13.    // char* info;
  14.     int len;
  15.     int offset;
  16. }Item ;
  17.  
  18. // ??????? ?????
  19. char *getStr();
  20. int getInt(int *N);
  21. char* antispace(char *str);
  22. //?????????? ???????
  23. int dialog(const char *msgs[], int N);
  24. int D_Add(Item *table, int *ntab, FILE **fp, FILE **in),           // ??????? ???????? ? ???????
  25.     D_Find(Item *table, int *ntab, FILE **fp, FILE **in),         // ????? ???????? ? ???????
  26.     D_Delete(Item *table, int *ntab, FILE **fp, FILE **in),      // ???????? ???????? ?? ???????
  27.     D_Show(Item *table, int *ntab, FILE **fp, FILE **in);       // ????? ??????????? ???????
  28. int (*fptr[])(Item *table, int *ntab, FILE **fp, FILE **in) = {NULL,D_Add,D_Find,D_Delete,D_Show};
  29.  
  30. //????????? ???????
  31. int insert(Item *table, int *n, int key, int len, int offset);
  32. int find(Item* table, int n, int key);
  33. //???????? ???????
  34. int load(Item *table, int *n, FILE **fp, FILE **in,char filename[]);
  35. int save(Item *table, int *n, FILE **fp);
  36. int main()
  37. {
  38.     FILE *fp, *in;
  39.     char *filename;
  40.     int i, ntab=0;
  41.     Item *table=(Item*)malloc(SIZE*sizeof(Item));
  42.     int rc;
  43.  
  44.     load(table, &ntab, &fp, &in, filename);
  45.     while(rc = dialog(msgs, Nmsgs))
  46.     {
  47.  
  48.         fptr[rc](table, &ntab, &fp, &in);
  49.         save(table, &ntab, &fp);
  50.     }
  51.     fclose(fp);
  52.     fclose(in);
  53.     return 0;
  54.  
  55. }
  56.  
  57. int load(Item *table, int *n, FILE **fp, FILE **in,char *filename)
  58. {
  59.     while(1)
  60.     {
  61.  
  62.         puts("Please enter file name");
  63.         filename=(char*)malloc(sizeof(char));
  64.         filename=getStr();
  65.         filename=(char*)realloc(filename, strlen(filename)+5);
  66.         strcat(filename,".dat");
  67.         if (strcmp(filename,"Data.dat") && strcmp(filename,"data.dat"))
  68.         {
  69.             puts(filename);
  70.             if(*fp=fopen(filename,"r+b"))
  71.             {
  72.                 fread(n,sizeof(int),1,*fp);
  73.                 fread(table,sizeof(Item),*n,*fp);
  74.                 rewind(*fp);
  75.                 break;
  76.             }
  77.  
  78.             else if (*fp=fopen(filename,"w+b"))
  79.                 break;
  80.             else
  81.                 puts("Error. Try again.");
  82.         }
  83.         else
  84.             puts("Sorry, but you can't use this name. Chose another");
  85.     }
  86.     if((*in=fopen("Data.dat","r+b")) == NULL)
  87.         if((*in=fopen("Data.dat","w+b")) == NULL)
  88.         {
  89.             puts("Total Error");
  90.             exit(1);
  91.         }
  92.  
  93.     rewind(*in);
  94.     return 1;
  95. }
  96.  
  97. int save(Item *table, int *n, FILE **fp)
  98. {
  99.     rewind(*fp);
  100.     fwrite(n,sizeof(int),1,*fp);
  101.     fwrite(table,sizeof(Item),*n,*fp);
  102.     rewind(*fp);
  103.     return 1;
  104. }
  105.  
  106. char* antispace(char* str)
  107. {
  108.     for(;*str!='\0';str++)
  109.         if (*str != ' ' && *str != '\t')
  110.             return str;
  111.     return NULL;
  112. }
  113.  
  114. char* getStr()
  115. {
  116.  
  117.     char *ptr = (char *)malloc(1);
  118.     char buf[21];
  119.     int n, len = 0;
  120.     *ptr = '\0';
  121.     do
  122.     {
  123.         n = scanf("%20[^\n]", buf);
  124.         if(n < 0)
  125.         {
  126.  
  127.             free(ptr);
  128.             ptr = NULL;
  129.             break;
  130.  
  131.         }
  132.         if(n == 0)
  133.             scanf("%*c");
  134.  
  135.  
  136.         else
  137.         {
  138.             len += strlen(buf);
  139.             ptr = (char *) realloc(ptr, len + 1);
  140.             strcat(ptr, buf);
  141.         }
  142.  
  143.     }
  144.  
  145.     while(n > 0);
  146.     return ptr;
  147. }
  148.  
  149. int getInt(int *N)
  150. {
  151.     int n;
  152.     n=scanf("%d",N);
  153.  
  154.         if (n < 0)
  155.         {
  156.             *N=0;
  157.             return 0;
  158.         }
  159.  
  160.         if( (n == 0) || (scanf("%[a-z]") == 1) )
  161.         {
  162.             *N=-1;
  163.             fflush(stdin);
  164.             return*N;
  165.         }
  166.         else
  167.         {
  168.             fflush(stdin);
  169.             return n;
  170.         }
  171.  
  172.  
  173. }
  174.  
  175.  
  176. int dialog(const char *msgs[], int N)
  177. {
  178.     int rc=1, i;
  179.     do
  180.     {
  181.         if (rc < 0 || rc >= N)
  182.             puts("Sorry, your request is wrong. Please, try again");
  183.         else
  184.             puts("Please put the number of selected action:");
  185.         for (i=0;i<N;i++)
  186.             puts(msgs[i]);
  187.  
  188.         getInt(&rc);
  189.     }
  190.     while (rc < 0 || rc >= N) ;
  191.     return rc;
  192. }
  193.  
  194. int D_Add(Item *table, int *ntab, FILE **fp, FILE **in)
  195. {
  196.  
  197.     int k,n=1,len,offset;
  198.     char *info = NULL,*str2;
  199.     info=(char*)malloc(sizeof(char));
  200.     do
  201.     {
  202.         if(n<0 || k<0)
  203.             puts("Your key is wrong. Please try again:");
  204.         else
  205.             puts("Enter key:");
  206.         n=getInt(&k);
  207.     }
  208.     while (n<0 || k<0);
  209.  
  210.     if(n == 0)
  211.         return 0;
  212.     do
  213.     {
  214.         if (info == NULL)
  215.             puts("Info is empty. Please try again:");
  216.         else
  217.             puts("Enter info:");
  218.  
  219.         info = getStr();
  220.         if (info != NULL)
  221.         info = antispace(info);
  222.             else
  223.         return 0;
  224.     }
  225.     while (info == NULL);
  226.  
  227.  
  228.  
  229.     offset=ftell(*in);
  230.     len=strlen(info);
  231.  
  232.     insert(table,ntab,k,len,offset);
  233.  
  234.     fseek(*in,offset,SEEK_SET);
  235.     fwrite(info,1,len+1,*in);
  236.  
  237.     str2=(char*)malloc(strlen(info)+1);
  238.     *str2=NULL;
  239.     fread(str2,1,len+1,*in);
  240.     free(str2);
  241.     return 1;
  242. }
  243.  
  244. int D_Find(Item *table, int *ntab, FILE **fp, FILE **in)
  245. {
  246.     int i,j,k,rel=0,n=1,nnew=0;
  247.     Item *newtable;
  248.  
  249.     do
  250.     {
  251.         if(n<0 || k<0)
  252.             puts("Your key is wrong. Please try again:");
  253.         else
  254.             puts("Enter key:");
  255.         n=getInt(&k);
  256.     }
  257.     while (n<0 || k<0);
  258.  
  259.     if(n == 0)
  260.         return 0;
  261.  
  262.     n=0;
  263.         do
  264.     {
  265.         if(n<0 || rel<0)
  266.             puts("Your release is wrong. Please try again:");
  267.         else
  268.             puts("Enter release[if necessary] or <0>");
  269.         n=getInt(&rel);
  270.     }
  271.     while (n<0 || rel<0);
  272.  
  273.     if(n == 0)
  274.         return 0;
  275.  
  276.     if (find(table,*ntab,k) >= 0)
  277.     {
  278.         j=i=find(table,*ntab,k);
  279.         if (rel<=0)
  280.         {
  281.             for(;table[j].key == k;j++,nnew++);
  282.  
  283.             newtable=(Item *)malloc(nnew*sizeof(Item));
  284.             for(j=i;table[j].key == k;j++)
  285.                 newtable[j-i]=table[j];
  286.  
  287.         }
  288.  
  289.         else
  290.             for(j=i;table[j].key == k;j++)
  291.             {
  292.                 if(table[j].release == rel)
  293.                 {
  294.                     nnew++;
  295.                     newtable=(Item *)malloc(sizeof(Item));
  296.                     newtable[0]=table[j];
  297.                 }
  298.  
  299.             }
  300.  
  301.     }
  302.     if(nnew>0)
  303.         D_Show(newtable,&nnew, fp, in);
  304.     else
  305.         puts("Item not found");
  306.  
  307.     return 1;
  308. }
  309.  
  310. int D_Show (Item *table, int *ntab, FILE **fp, FILE **in)
  311. {
  312.     int i;
  313.     char *info;
  314.     puts("///////////////////////////");
  315.  
  316.     if (*ntab>0)
  317.         for(i=0;i<*ntab;i++)
  318.         {
  319.             fseek(*in,table[i].offset,SEEK_SET);
  320.             info=(char*)malloc(table[i].len+1);
  321.             *info=NULL;
  322.             fread(info,1,table[i].len+1,*in);
  323.             printf("Table[%d]: key - %d, release - %d, info - %s\n",i,table[i].key,table[i].release,info);
  324.             free(info);
  325.         }
  326.     else
  327.         puts("Table is empty");
  328.     puts("///////////////////////////");
  329.     return 1;
  330. }
  331.  
  332. int D_Delete (Item *table, int *ntab, FILE **fp, FILE **in)
  333. {
  334.  
  335.     int i,j;
  336.     for(i=0;i<*ntab;i++)
  337.     {
  338.         if(table[i].release>table[i-1].release)
  339.         {
  340.                 for(j=i;j<*ntab;j++)
  341.                     table[j-1]=table[j];
  342.  
  343.                 *ntab=*ntab-1;
  344.                 i--;
  345.                 table[i].release=1;
  346.         }
  347.     }
  348.     puts("Table changed");
  349.     return 1;
  350. }
  351.  
  352. int find(Item* table, int ntab, int key)
  353. {
  354.     int i;
  355.     for (i=0;i<ntab;i++)
  356.     {
  357.         if (table[i].key == key)
  358.             return i;
  359.  
  360.  
  361.     }
  362.     return -1;
  363. }
  364.  
  365. int insert(Item *table, int *ntab, int key, int len, int offset)
  366. {
  367.     int i,j,rel;
  368.     rel=1;
  369.     if (*ntab == 0)
  370.         i=0;
  371.  
  372.    else
  373.    {
  374.        i=find(table,*ntab,key);
  375.     if (i >= 0)
  376.         {
  377.  
  378.  
  379.  
  380.             while (table[i].key == key)
  381.             {
  382.  
  383.                 i++;
  384.                 rel++;
  385.  
  386.             }
  387.             for(j=*ntab;j>i;j--)
  388.                 table[j]=table[j-1];
  389.  
  390.  
  391.  
  392.         }
  393.     else
  394.         {
  395.             i=0;j=0;
  396.             while (i<*ntab)
  397.             {
  398.  
  399.                 if(table[i].len == 0)
  400.                 {
  401.                     table[j]=table[i];
  402.                     j++;
  403.                 }
  404.                 i++;
  405.             }
  406.             j=i;
  407.         }
  408.    }
  409.     *ntab=*ntab+1;
  410.     table[i].key=key;
  411.     //table[i].info=info;
  412.     table[i].release=rel;
  413.     table[i].len=len;
  414.     table[i].offset=offset;
  415.  
  416.  
  417.     return 1;
  418. }
  419.  
View raw paste Reply