Advertisement
Pohuyumer

𝔹𝕆$$ 𝕆𝔽 𝕋ℍ𝔼 𝔾𝕐𝕄 TFile

Jun 8th, 2020
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.63 KB | None | 0 0
  1. #pragma once
  2. #include <stddef.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5. #define BUFFER 2
  6.  
  7. struct TInfo
  8. {
  9.     char name[31];    // название изделия
  10.     char gender[31];  // тип(мужская, женская или детская) изделия
  11.     char season[31];  // сезон изделия
  12.     char color[31];   // цвет изделия
  13.  
  14.     int size,        // размер изделия
  15.         price;        // количество изделий, имеющееся в наличии
  16. };
  17.  
  18. struct TQueue
  19. {
  20.     char fname[31]; //имя файла
  21.     int Head; //начало
  22.     int Tail; //конец
  23.     FILE* f;
  24. };
  25.  
  26.  
  27. bool IsEmpty(TQueue queue); //проверка на пустоту
  28. void InitializeQueue(TQueue& queue); //инициализация
  29. void AddToTail(TQueue& queue, TInfo info);
  30. void Print(TQueue queue, FILE*& f);
  31. TInfo TakeFromHead(TQueue& queue);
  32. void Print(TQueue queue, FILE*& f);
  33.  
  34.  
  35.  
  36. bool IsEmpty(TQueue queue) //проверка на пустоту
  37. {
  38.     if (queue.Tail < queue.Head)
  39.         return true;
  40.     else
  41.         return false;
  42. }
  43.  
  44. void InitializeQueue(TQueue& queue)
  45. {
  46.     srand(time(NULL));
  47.     for (int i = 0; i < 31; i++)
  48.     {
  49.         queue.fname[i] = '\0';
  50.     }
  51.     for (int i = 0; i < 10; i++)
  52.     {
  53.         queue.fname[i] = (char)(rand() % 26 + 64); //создаем случайное название файла
  54.     }
  55.     strcat(queue.fname, ".bin");
  56.  
  57.  
  58.     queue.f = fopen(queue.fname, "w+b");
  59.     queue.Head = 0;
  60.     queue.Tail = queue.Head - sizeof(TInfo);
  61.     fclose(queue.f);
  62. }
  63.  
  64.  
  65. void AddToTail(TQueue& queue, TInfo info)
  66. {
  67.     queue.f = fopen(queue.fname, "r+b");
  68.     queue.Tail += sizeof(TInfo);
  69.     fseek(queue.f, queue.Tail, SEEK_SET);
  70.     fwrite(&info, sizeof(TInfo), 1, queue.f);
  71.  
  72.     fclose(queue.f);
  73. }
  74.  
  75. TInfo TakeFromHead(TQueue& queue)
  76. {
  77.     if (!IsEmpty(queue))
  78.     {
  79.         TInfo buff;
  80.         queue.f = fopen(queue.fname, "r+b");
  81.  
  82.         fseek(queue.f, queue.Head, SEEK_SET);
  83.         fread(&buff, sizeof(TInfo), 1, queue.f);
  84.         queue.Head += sizeof(TInfo);
  85.  
  86.  
  87.  
  88.         if (queue.Head >= BUFFER * sizeof(TInfo))
  89.         {
  90.             TInfo tmp;
  91.             for (int i = queue.Head; i <= queue.Tail; i += sizeof(TInfo))
  92.             {
  93.                 fseek(queue.f, i, SEEK_SET);
  94.                 fread(&tmp, sizeof(TInfo), 1, queue.f);
  95.                 fseek(queue.f, 0 - (BUFFER + 1) * sizeof(TInfo), SEEK_CUR);
  96.                 fwrite(&tmp, sizeof(TInfo), 1, queue.f);
  97.             }
  98.  
  99.             queue.Tail = -queue.Head + queue.Tail;
  100.             queue.Head = 0;
  101.         }
  102.         fclose(queue.f);
  103.         return buff;
  104.     }
  105. }
  106.  
  107. void Print(TQueue queue, FILE*& f)
  108. {
  109.  
  110.     queue.f = fopen(queue.fname, "r+b");
  111.     fseek(queue.f, queue.Head, SEEK_SET);
  112.  
  113.     for (int i = queue.Head; i <= queue.Tail; i += sizeof(TInfo))
  114.     {
  115.         TInfo buff;
  116.         fread(&buff, sizeof(TInfo), 1, queue.f);
  117.         fprintf(f, "%31s%31s%31s%31s%5d%8d\n", buff.name, buff.gender, buff.season, buff.color, buff.size, buff.price);
  118.  
  119.     }
  120.     fprintf(f, "\n\n");
  121.     fclose(queue.f);
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement