Advertisement
Guest User

Untitled

a guest
May 21st, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.56 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "Data.h"
  3. #include "stdlib.h"
  4. #include "time.h"
  5. #include "string.h"
  6.  
  7. MY_CAR *CreateArray(size_t no_items)
  8. {
  9.     MY_CAR *tab = (MY_CAR *)malloc(no_items * sizeof(MY_CAR));
  10.     if (tab)
  11.         memset(tab, 0, no_items * sizeof(MY_CAR));
  12.     return tab;
  13. }
  14.  
  15. MY_CAR * FreeArray(MY_CAR *tab)
  16. {
  17.     if (tab)
  18.     {
  19.         size_t it, no_items = _msize(tab) / sizeof(MY_CAR);
  20.         for (it = 0; it < no_items; ++it)
  21.         {
  22.             if (tab[it].model)
  23.                 free(tab[it].model);
  24.             tab[it].model = NULL;
  25.         }
  26.  
  27.         free(tab);
  28.         tab = NULL;
  29.     }
  30.  
  31.     return NULL;
  32. }
  33.  
  34. int FillArray(MY_CAR *tab)
  35. {
  36.     char ch = 'a';
  37.     char str[128];
  38.     size_t it, no_items = _msize(tab) / sizeof(MY_CAR);
  39.     int s_begin = 32, s_end = 127, symb, len, i, year = 1000;
  40.    
  41.     srand(time(NULL));
  42.  
  43.     for (it = 0; it < no_items; ++it)
  44.     {
  45.         len = rand()*20/RAND_MAX+5;
  46.        
  47.         for (i = 0; i < len; ++i)
  48.         {
  49.             //symb = 'a'; //rand() * (127 - 32) / RAND_MAX + 32;
  50.             str[i] = ch;
  51.             ch++;
  52.         }
  53.         str[i] = '\0';
  54.  
  55.         tab[it].model = (char *)malloc((len + 1) * sizeof(char));
  56.         if (!tab[it].model)
  57.             return 0;
  58.  
  59.         strcpy_s(tab[it].model, (len + 1) * sizeof(char), str);
  60.         tab[it].year = year++;
  61.     }
  62.  
  63.     return 1;
  64. }
  65.  
  66. void PrintArray(MY_CAR *tab, char *title)
  67. {
  68.     printf("%s\n", title);
  69.     size_t it, no_items = _msize(tab) / sizeof(MY_CAR);
  70.  
  71.     for (it = 0; it < no_items; ++it)
  72.     {
  73.         printf("%s   %d\n", tab[it].model, tab[it].year);
  74.     }
  75. }
  76.  
  77. void MyExit(FILE *pft, MY_CAR *tab, __int64 *fdesc)
  78. {
  79.     if (pft)
  80.         fclose(pft);
  81.  
  82.     FreeArray(tab);
  83.  
  84.     if (fdesc)
  85.         free(fdesc);
  86.  
  87.     printf("fatal error\n");
  88.     system("pause");
  89.     exit(1);
  90. }
  91.  
  92. void Save(MY_CAR * tab, char *filename)
  93. {
  94.     size_t it, no_items = _msize(tab) / sizeof(MY_CAR);
  95.     unsigned int no_it = (unsigned int)no_items;
  96.     __int64 filepos = 0;
  97.     __int64 *file_desc = (__int64 *)malloc((no_items + 1) * sizeof(__int64));
  98.     if(!file_desc)
  99.         MyExit(NULL, tab, file_desc);
  100.  
  101.     FILE *pf = fopen(filename, "wb");
  102.     if (!pf)
  103.         MyExit(pf, tab, file_desc);
  104.  
  105.     if (fwrite(&no_it, sizeof(unsigned int), 1, pf) != 1)
  106.         MyExit(pf, tab, file_desc);
  107.        
  108.  
  109.     //rezerwujemy miejsce w pliku dla file_descr
  110.     _fseeki64(pf, (no_items + 1) * sizeof(__int64), SEEK_CUR);
  111.  
  112.     for (it = 0; it < no_items; ++it)
  113.     {
  114.         file_desc[it] = ftell(pf);            
  115.         tab[it].len = (unsigned int)(strlen(tab[it].model) + 1);
  116.        
  117.         if (fwrite(&tab[it], sizeof(tab[0]), 1, pf) != 1) //sizeof(MY_CAR)
  118.             MyExit(pf, tab, file_desc);
  119.  
  120.         if (fwrite(tab[it].model, sizeof(tab[it].model[0]), (size_t)(tab[it].len), pf) != (size_t)(tab[it].len))
  121.             MyExit(pf, tab, file_desc);
  122.     }
  123.  
  124.     file_desc[it] = ftell(pf);   //!!!
  125.  
  126.     //zapisujemy wskazniki pozycji dla kazdego recordu
  127.     _fseeki64(pf, sizeof(unsigned int), SEEK_SET);
  128.     if (fwrite(file_desc, sizeof(__int64), no_items + 1, pf) != no_items + 1)
  129.         MyExit(pf, tab, file_desc);
  130.  
  131.     if(pf)
  132.         fclose(pf);
  133.     pf = NULL;
  134.  
  135.     if (file_desc)
  136.         free(file_desc);
  137.     file_desc = NULL;
  138. }
  139.  
  140. MY_CAR * Read(MY_CAR * tab, char *filename)
  141. {
  142.     if (tab)
  143.         tab = FreeArray(tab);
  144.  
  145.     unsigned int no_items = 0, it, rec;
  146.     __int64 rec_len;
  147.     __int64 *file_desc = NULL;
  148.  
  149.     FILE *pf = fopen(filename, "rb");
  150.     if(!pf)
  151.         MyExit(pf, tab, file_desc);
  152.  
  153.     if(fread(&no_items, sizeof(unsigned int), 1, pf) != 1)
  154.         MyExit(pf, tab, file_desc);
  155.  
  156.     tab = CreateArray((size_t)no_items);
  157.     file_desc = (__int64 *)malloc((no_items + 1) * sizeof(__int64));
  158.     if(!tab || !file_desc)
  159.         MyExit(pf, tab, file_desc);
  160.  
  161.     if(fread(file_desc, sizeof(file_desc[0]), no_items + 1, pf) != no_items + 1)
  162.         MyExit(pf, tab, file_desc);
  163.  
  164.     for (it = 0; it < no_items; ++it)
  165.     {
  166.         rec = no_items - it - 1;
  167.         rec_len = file_desc[rec + 1] - file_desc[rec];
  168.  
  169.         _fseeki64(pf, file_desc[rec], SEEK_SET);
  170.         if(fread(&tab[rec], sizeof(tab[rec]), 1, pf) != 1)
  171.             MyExit(pf, tab, file_desc);
  172.  
  173.         tab[rec].model = (char *)malloc(tab[rec].len*sizeof(char));
  174.         if(!tab[rec].model)
  175.             MyExit(pf, tab, file_desc);
  176.  
  177.         if(fread(tab[rec].model, sizeof(char), tab[rec].len, pf) != tab[rec].len)
  178.             MyExit(pf, tab, file_desc);
  179.     }
  180.  
  181.     if (file_desc)
  182.         free(file_desc);
  183.     file_desc = NULL;
  184.  
  185.     if (pf)
  186.         fclose(pf);
  187.     pf = NULL;
  188.  
  189.     return tab;
  190. }
  191.  
  192.  
  193. // data.h
  194.  
  195.  
  196. #pragma once
  197.  
  198. #pragma warning (disable : 4996)
  199.  
  200. struct MY_CAR
  201. {
  202.     int year;
  203.     char *model;
  204.  
  205.     //Dla systemu zapisu - odczytu
  206.     unsigned int len;  //ilosc slow w tablice model
  207. };
  208.  
  209. MY_CAR * CreateArray(size_t no_items);
  210. MY_CAR * FreeArray(MY_CAR * tab);
  211. int FillArray(MY_CAR *tab);
  212. void PrintArray(MY_CAR *tab, char *title);
  213. void MyExit(FILE *pft, MY_CAR *tab, __int64 *fdesc);
  214.  
  215. void Save(MY_CAR * tab, char *filename);
  216. MY_CAR * Read(MY_CAR * tab, char *filename);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement