Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- typedef struct
- {
- char name[50];
- char singer[50];
- int min;
- int sec;
- char genre[20];
- } Music; //структура с описанием нашей музыкальной композиции
- void create(void) // функция для создания бинарного файла
- {
- int i,n;
- char filename[100]={};
- puts("Enter file name"); // ввод имени файла
- gets(filename);
- puts("Enter count of elements"); // ввод количества элементов, добавляемых в файл
- scanf("%d",&n);
- Music song; //делаем одну переменную для записи данных
- FILE *fp=fopen(filename, "wb"); // открываем файл на запись
- fflush(stdin); // очищаем поток от мусора
- for (i = 0; i < n; ++i) // вводим элементы
- {
- printf("Describe Song #%d\nName of Song > ",i+1);
- gets(song.name);
- printf("Singer > ");
- gets(song.singer);
- printf("Time (mm ss) > ");
- scanf("%d%d",&song.min,&song.sec);
- fflush(stdin);
- printf("Genre > ");
- gets(song.genre);
- printf("Song #%d <%s>, Singer <%s>, time %d:%d, genre <%s>\n", i+1,song.name,song.singer,song.min,song.sec,song.genre);
- fwrite(&song,sizeof(Music),1,fp); // после ввода каждого элемента записываем его в файл
- }
- fclose(fp); // закрываем файл
- }
- Music* load(int *count) // функция загрузки из файла
- {
- int i;
- char filename[100]={};
- puts("Enter file name"); // вводим откуда грузить
- gets(filename);
- FILE *fp=fopen(filename, "rb"); // пытаемся открыть файл
- if (fp==NULL) // если файл не открылся - ругаемся
- {
- puts("There is no file with this name");
- return NULL;
- }
- fseek(fp,0,SEEK_END); // курсор в конец
- int lenght=sizeof(Music); // сохраняем размер одной записи (необязательно)
- int size = ftell(fp) / lenght; // узнаем количество записей
- Music *Album = (Music*)malloc(size * lenght); // выделяем память
- rewind(fp); // перематываем файл
- for (i = 0; i < size; ++i) // считываем в массив из файла
- {
- fread(&Album[i],sizeof(Music),1,fp);
- }
- fclose(fp);
- *count = size; // записываем по адресу количество элементов
- return Album; // возвращаем адрес начала массива
- }
- void view(Music *Album, int num) // функция просмотра массива в памяти программы
- {
- int i;
- for (i = 0; i < num; ++i)
- {
- printf("Song #%d <%s>, Singer <%s>, time %d:%d, genre <%s>\n",\
- i+1,Album[i].name,Album[i].singer,Album[i].min,Album[i].sec,Album[i].genre);
- }
- }
- void view_4(Music *Album, int num) // индивидуальное задание
- {
- int i;
- for (i = 0; i < num; ++i)
- {
- if (Album[i].min<4)
- printf("Song #%d <%s>, Singer <%s>, time %d:%d, genre <%s>\n",\
- i+1,Album[i].name,Album[i].singer,Album[i].min,Album[i].sec,Album[i].genre);
- }
- }
- void add(void) // функция добавления данных в конец файла
- {
- char filename[100]={};
- puts("Enter file name"); // ввод имени файла
- gets(filename);
- Music song;
- FILE *fp=fopen(filename, "ab+"); // открываем файл на дозапись
- fflush(stdin);
- printf("Describe Song \nName of Song > ");
- gets(song.name);
- printf("Singer > ");
- gets(song.singer);
- printf("Time (mm ss) > ");
- scanf("%d%d",&song.min,&song.sec);
- fflush(stdin);
- printf("Genre > ");
- gets(song.genre);
- printf("Added to file %s -> <%s>, Singer <%s>, time %d:%d, genre <%s>\n",\
- filename,song.name,song.singer,song.min,song.sec,song.genre);
- fwrite(&song,sizeof(Music),1,fp); // после ввода данных пишем их в конец файла
- fclose(fp); // закрываем файл
- }
- void change(void) // функция изменения данных в файле
- {
- int changing;
- char filename[100]={};
- puts("Enter file name");
- gets(filename);
- FILE *fp=fopen(filename, "rb+");
- fseek(fp,0,SEEK_END); // курсор в конец
- int lenght=sizeof(Music); // сохраняем размер одной записи (необязательно)
- int size = ftell(fp) / lenght; // узнаем количество записей
- fflush(stdin);
- printf("In file %s %d elements\n",filename,size);
- do
- {
- puts("Enter # of element to change");
- scanf("%d",&changing);
- } while (changing<=0 || changing>size);
- fflush(stdin);
- Music song;
- printf("Describe Song \nName of Song > ");
- gets(song.name);
- printf("Singer > ");
- gets(song.singer);
- printf("Time (mm ss) > ");
- scanf("%d%d",&song.min,&song.sec);
- fflush(stdin);
- printf("Genre > ");
- gets(song.genre);
- printf("Changed in file %s element #%d -> <%s>, Singer <%s>, time %d:%d, genre <%s>\n",\
- filename,changing,song.name,song.singer,song.min,song.sec,song.genre);
- fseek(fp,(changing-1)*sizeof(Music),SEEK_SET); // смещаемся на начало элемента в файле
- fwrite(&song,sizeof(Music),1,fp);
- fclose(fp);
- }
- void deletefromfile(void)
- {
- int i,todelete;
- char filename[100]={};
- puts("Enter file name");
- gets(filename);
- FILE *fp=fopen(filename, "rb");
- FILE *fp2=fopen("temp.dat", "wb");
- fseek(fp,0,SEEK_END); // курсор в конец
- int lenght=sizeof(Music); // сохраняем размер одной записи (необязательно)
- int size = ftell(fp) / lenght; // узнаем количество записей
- Music song;
- rewind(fp);
- fflush(stdin);
- printf("In file %s %d elements\n",filename,size);
- do
- {
- puts("Enter # of element to delete");
- scanf("%d",&todelete);
- } while (todelete<=0 || todelete>size);
- fflush(stdin);
- for (i = 0; i < size; ++i)
- {
- fread(&song,sizeof(Music),1,fp);
- if (i!=(todelete-1)) // если текущая запись не удаляемая
- {
- fwrite(&song,sizeof(Music),1,fp2); // то записываем
- printf("Added to file %s -> <%s>, Singer <%s>, time %d:%d, genre <%s>\n",\
- filename,song.name,song.singer,song.min,song.sec,song.genre);
- }
- }
- fclose(fp2);
- fclose(fp);
- remove(filename);
- rename("temp.dat",filename);
- }
- int main()
- {
- Music *Album=NULL; //указатель для динамического массива
- int count=0; // переменная для указания количества элементов в памяти
- char menu; // переменная для работы меню
- do
- {
- system("cls");
- puts ("1. Create file"); puts ("2. Load from file");
- puts ("3. View "); puts ("4. View <4 min");
- puts ("5. Add to file "); puts ("6. Change in file");
- puts ("7. Delete from file "); puts ("8. Exit");
- menu = getch(); // запись нажатой клавиши в переменную меню
- switch (menu) // в зависимости от меню выбираем действие
- {
- case '1': create(); break;
- case '2': if (Album) free(Album); Album=load(&count); printf("\nread %d elements from file \n",count); break;
- case '3': if (count!=0) view(Album,count); else puts("Nothing to view"); break;
- case '4': if (count!=0) view_4(Album,count); else puts("Nothing to view"); break;
- case '5': add(); break;
- case '6': change(); break;
- case '7': deletefromfile(); break;
- }
- system("pause");
- }
- while (menu!='8'); // если нажали 8 - выходим.
- if (Album) free(Album);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement