Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
593
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.30 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4.  
  5. typedef struct
  6. {
  7.     char name[50];
  8.     char singer[50];
  9.     int min;
  10.     int sec;
  11.     char genre[20];
  12. } Music; //структура с описанием нашей музыкальной композиции
  13.  
  14. void create(void) // функция для создания бинарного файла
  15. {
  16.     int i,n;
  17.     char filename[100]={};
  18.     puts("Enter file name"); // ввод имени файла
  19.     gets(filename);
  20.     puts("Enter count of elements"); // ввод количества элементов, добавляемых в файл
  21.     scanf("%d",&n);
  22.     Music song; //делаем одну переменную для записи данных
  23.     FILE *fp=fopen(filename, "wb"); // открываем файл на запись
  24.     fflush(stdin); // очищаем поток от мусора
  25.     for (i = 0; i < n; ++i) // вводим элементы
  26.     {
  27.         printf("Describe Song #%d\nName of Song > ",i+1);
  28.         gets(song.name);
  29.         printf("Singer > ");
  30.         gets(song.singer);
  31.         printf("Time (mm ss) > ");
  32.         scanf("%d%d",&song.min,&song.sec);
  33.         fflush(stdin);
  34.         printf("Genre > ");
  35.         gets(song.genre);
  36.         printf("Song #%d <%s>, Singer <%s>, time %d:%d, genre <%s>\n", i+1,song.name,song.singer,song.min,song.sec,song.genre);
  37.         fwrite(&song,sizeof(Music),1,fp); // после ввода каждого элемента записываем его в файл
  38.     }
  39.     fclose(fp); // закрываем файл
  40. }
  41.  
  42. Music* load(int *count) // функция загрузки из файла
  43. {
  44.     int i;
  45.     char filename[100]={};
  46.     puts("Enter file name"); // вводим откуда грузить
  47.     gets(filename);
  48.     FILE *fp=fopen(filename, "rb"); // пытаемся открыть файл
  49.     if (fp==NULL) // если файл не открылся - ругаемся
  50.         {
  51.             puts("There is no file with this name");
  52.             return NULL;
  53.         }
  54.     fseek(fp,0,SEEK_END); // курсор в конец
  55.     int lenght=sizeof(Music); // сохраняем размер одной записи (необязательно)
  56.     int size = ftell(fp) / lenght; // узнаем количество записей
  57.     Music *Album = (Music*)malloc(size * lenght); // выделяем память
  58.     rewind(fp); // перематываем файл
  59.     for (i = 0; i < size; ++i) // считываем в массив из файла
  60.     {
  61.         fread(&Album[i],sizeof(Music),1,fp);
  62.     }
  63.     fclose(fp);
  64.     *count = size; // записываем по адресу количество элементов
  65.     return Album; // возвращаем адрес начала массива
  66. }
  67.  
  68. void view(Music *Album, int num) // функция просмотра массива в памяти программы
  69. {
  70.     int i;
  71.     for (i = 0; i < num; ++i)
  72.     {
  73.         printf("Song #%d <%s>, Singer <%s>, time %d:%d, genre <%s>\n",\
  74.         i+1,Album[i].name,Album[i].singer,Album[i].min,Album[i].sec,Album[i].genre);
  75.     }
  76. }
  77. void view_4(Music *Album, int num) // индивидуальное задание
  78. {
  79.     int i;
  80.     for (i = 0; i < num; ++i)
  81.     {
  82.         if (Album[i].min<4)
  83.         printf("Song #%d <%s>, Singer <%s>, time %d:%d, genre <%s>\n",\
  84.         i+1,Album[i].name,Album[i].singer,Album[i].min,Album[i].sec,Album[i].genre);
  85.     }
  86. }
  87.  
  88. void add(void) // функция добавления данных в конец файла
  89. {
  90.     char filename[100]={};
  91.     puts("Enter file name"); // ввод имени файла
  92.     gets(filename);
  93.     Music song;
  94.     FILE *fp=fopen(filename, "ab+"); // открываем файл на дозапись
  95.     fflush(stdin);
  96.     printf("Describe Song \nName of Song > ");
  97.     gets(song.name);
  98.     printf("Singer > ");
  99.     gets(song.singer);
  100.     printf("Time (mm ss) > ");
  101.     scanf("%d%d",&song.min,&song.sec);
  102.     fflush(stdin);
  103.     printf("Genre > ");
  104.     gets(song.genre);
  105.     printf("Added to file %s -> <%s>, Singer <%s>, time %d:%d, genre <%s>\n",\
  106.            filename,song.name,song.singer,song.min,song.sec,song.genre);
  107.     fwrite(&song,sizeof(Music),1,fp); // после ввода данных пишем их в конец файла
  108.     fclose(fp); // закрываем файл
  109. }
  110.  
  111. void change(void) // функция изменения данных в файле
  112. {
  113.     int changing;
  114.     char filename[100]={};
  115.     puts("Enter file name");
  116.     gets(filename);
  117.     FILE *fp=fopen(filename, "rb+");
  118.     fseek(fp,0,SEEK_END); // курсор в конец
  119.     int lenght=sizeof(Music); // сохраняем размер одной записи (необязательно)
  120.     int size = ftell(fp) / lenght; // узнаем количество записей
  121.     fflush(stdin);
  122.     printf("In file %s %d elements\n",filename,size);
  123.     do
  124.     {
  125.         puts("Enter # of element to change");
  126.         scanf("%d",&changing);
  127.     } while (changing<=0 || changing>size);
  128.     fflush(stdin);
  129.     Music song;
  130.     printf("Describe Song \nName of Song > ");
  131.     gets(song.name);
  132.     printf("Singer > ");
  133.     gets(song.singer);
  134.     printf("Time (mm ss) > ");
  135.     scanf("%d%d",&song.min,&song.sec);
  136.     fflush(stdin);
  137.     printf("Genre > ");
  138.     gets(song.genre);
  139.     printf("Changed in file %s element #%d -> <%s>, Singer <%s>, time %d:%d, genre <%s>\n",\
  140.            filename,changing,song.name,song.singer,song.min,song.sec,song.genre);
  141.     fseek(fp,(changing-1)*sizeof(Music),SEEK_SET); // смещаемся на начало элемента в файле
  142.     fwrite(&song,sizeof(Music),1,fp);
  143.     fclose(fp);
  144. }
  145.  
  146.  
  147. void deletefromfile(void)
  148. {
  149.     int i,todelete;
  150.     char filename[100]={};
  151.     puts("Enter file name");
  152.     gets(filename);
  153.     FILE *fp=fopen(filename, "rb");
  154.     FILE *fp2=fopen("temp.dat", "wb");
  155.     fseek(fp,0,SEEK_END); // курсор в конец
  156.     int lenght=sizeof(Music); // сохраняем размер одной записи (необязательно)
  157.     int size = ftell(fp) / lenght; // узнаем количество записей
  158.     Music song;
  159.     rewind(fp);
  160.     fflush(stdin);
  161.     printf("In file %s %d elements\n",filename,size);
  162.     do
  163.     {
  164.         puts("Enter # of element to delete");
  165.         scanf("%d",&todelete);
  166.     } while (todelete<=0 || todelete>size);
  167.     fflush(stdin);
  168.     for (i = 0; i < size; ++i)
  169.     {
  170.         fread(&song,sizeof(Music),1,fp);
  171.         if (i!=(todelete-1)) // если текущая запись не удаляемая
  172.         {
  173.             fwrite(&song,sizeof(Music),1,fp2); // то записываем
  174.             printf("Added to file %s -> <%s>, Singer <%s>, time %d:%d, genre <%s>\n",\
  175.            filename,song.name,song.singer,song.min,song.sec,song.genre);
  176.         }
  177.  
  178.     }
  179.     fclose(fp2);
  180.     fclose(fp);
  181.     remove(filename);
  182.     rename("temp.dat",filename);
  183. }
  184.  
  185.  
  186. int main()
  187. {
  188.     Music *Album=NULL; //указатель для динамического массива
  189.     int count=0; // переменная для указания количества элементов в памяти
  190.     char menu; // переменная для работы меню
  191.     do
  192.     {
  193.         system("cls");
  194.         puts ("1. Create file"); puts ("2. Load from file");
  195.         puts ("3. View "); puts ("4. View <4 min");
  196.         puts ("5. Add to file "); puts ("6. Change in file");
  197.         puts ("7. Delete from file "); puts ("8. Exit");
  198.         menu = getch(); // запись нажатой клавиши в переменную меню
  199.         switch (menu)  // в зависимости от меню выбираем действие
  200.         {
  201.             case '1': create(); break;
  202.             case '2': if (Album) free(Album); Album=load(&count); printf("\nread %d elements from file \n",count); break;
  203.             case '3': if (count!=0) view(Album,count); else puts("Nothing to view"); break;
  204.             case '4': if (count!=0) view_4(Album,count); else puts("Nothing to view"); break;
  205.             case '5': add(); break;
  206.             case '6': change(); break;
  207.             case '7': deletefromfile(); break;
  208.         }
  209.         system("pause");
  210.     }
  211.     while (menu!='8'); // если нажали 8 - выходим.
  212.     if (Album) free(Album);
  213.     return 0;
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement