МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра САПР
Звіт
до лабораторної роботи №3
на тему:
«ІНДЕКСНО-ПОСЛІДОВНИЙ МЕТОД ДОСТУПУ ДО ФАЙЛІВ НА ЗОВНІШНІХ ЗАПАМ’ЯТОВУЮЧИХ ПРИСТРОЯХ»
Мета:
Розглянути органiзацiю i ведення файлiв iндексно-послiдовного доступу; набути практичнi навички у програмуваннi алгоритмiв iндексно-послiдовного доступу до файлiв на зовнiшнiх запам'ятовуючих пристроях.
Завдання:
Написати програму, яка реалiзує алгоритми роботи iндексно-послiдов ного методу доступу до iнформацiї на зовнiшнiх носiях:
Створення БД.
Вставка елементу в БД.
Видалення запису з БД.
Модифікація запису.
Пошук.
Перегляд.
Теоретичні відомості:
Якщо файл впорядкований по ключах, то звичайно для адресацiї використовується таблиця, що називається iндексом. При звертаннi до таблицi задається ключ шуканого запису, а результатом процедури пошуку у таблицi є вiдносна адреса запису у зовнiшнiй пам'ятi.
Якщо для адресацiї файла використовується iндекс, ЕОМ в основному здiйснює пошук в iндексi, а не у файлi даних. При цьому суттєво економиться час, але потребується пам'ять для зберiгання iндексу.
Існує багато iндексних методiв доступу, в основi яких лежить принцип створення окремого iндексного файла. індексний файл значно менший вiд власне бази даних, i, оскiльки вiн може повнiстю зберiгатися в оперативнiй пам'ятi, швидкодiя пошуку у ньому значно вища.
В iндексно-послiдовному методi доступу iндексний файл завжди впорядкований за так званим первинним ключем (головний атрибут фiзичного запису).
Оскiльки у цьому методi i записи файла даних впорядкованi за ключем, iндекс звичайно мiстить не посилання на окремий запис, а посилання на блоки записiв, всерединi яких можна здiйснювати пошук i сканування. Збереження посилань на блоки записiв, а не на окремi записи значно зменшує розмiр iндексу. Наприклад, якщо в блоцi зберiгається 10 записiв, то для нього в iндексному файлi буде одна стаття, а не 10, i розмiр iндексного файла зменшується в 10 разiв.
Індексний файл i файл даних органiзованi послiдовно. Індексний файл мiстить лише максимальнi значення первинних ключiв записiв кожного блока.
Послiдовна органiзацiя індексного файла допускає iндексацiю його вмiсту. Записи iндексу групуються у блоки, якi можна iндексувати. Індексний файл наступного рiвня мiстить вказiвники на індекснi файли попереднього рiвня.
При роботi з великими файлами така органiзацiя дає змогу покращити характеристики доступу.
Індексний файл складається з пар (значення ключа, адреса блока). Пара (v,b) з'являється у файлi iндексу, якщо перший запис у блоцi з адресою b має значення ключа v. Перше поле є ключем файла iндексу, який пiдтримується вiдсортованим за значенням свого ключа.
В iндексно-послiдовному файлi необхiдно отримати вiдповiдi на запитання:
якщо задане значення ключа v1 для iндексного файла, знайти в iндексi такий запис (v2,b), що v2<=v1 i або (v2,b) ї останнiм записом у iндексi, або наступний запис (v3,b) задовольняє умову v1<v3. У цiй ситуацiї говорять, що v2 покриває v1. Отже, ми знаходимо блок b головного файла, що мiстить запис iз значенням ключа v1, оскiльки файл iндексу з гарантiїю є вiдсортованим.
Пiд час вставляння нових записiв виникає необхiднiсть або пересортовувати файл, або вносити новi записи в окрему дiлянку i органiзувати вказiвники на цi записи.
Цi записи помiщаються у дiлянку переповнення. Такi файли перiодично реорганiзовуються, т.б. записи файла заново сортуються i здiйснюються вiдповiднi змiни в iндексi.
Для уникнення частого використання процедури реорганiзацiї у файлi передбачаються позицiї з порожнiми записами (подiл файла даних на блоки). Але даний метод не дає змоги повнiстю уникнути виконання процедури реорганiзацiї.
Розглянемо операцiї пошуку, вставляння, видалення i модифiкацiї над вiдсортованим файлом iз записами, не закрiпленими вказiвниками за фіксованими адресами. Цi 4-и операцiї потребують вставляння, видалення, модифiкацiї у файлi iндексу.
Вхiдний вiдсортований файл мiститься у послiдовностi блокiв b1, b2,...,bk. Записи у кожному блоцi мiстяться у сортованоiй послiдовностi, причому записи блока bi передують записам блока bi+1. У заголовку кожного блока знаходиться iнформацiя, що вказує, який iз субблокiв мiстить записи, а який є вiльним.
Текст програми:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#define MAXNAME 40
#define MAXPLATFORM 20
#define MAXDEVELOPER 30
#define MAXPUBLISHER 30
#define MAXRELEASEDATE 10
#define MAXGENRE 20
#define MAXHOMEPAGE 20
#define MAXTRANSMITTER 3
#define MAXGRAPHICS 10
void addSpaces(int,FILE *);
void frotSpaces(int,FILE *);
int whatNumber(int);
void addNewBlock(FILE *);
void addNewRecord(struct game add,FILE *);
void editRecord(struct game add,FILE *, int whatEdit);
void searchRecord(FILE *);
struct game {
int ID;
char name[MAXNAME];
char developer[MAXDEVELOPER];
char publisher[MAXPUBLISHER];
char platform[MAXPLATFORM];
char genre[MAXGENRE];
char homepage[MAXHOMEPAGE];
char releaseDate[MAXRELEASEDATE];
int age;
char transmitter[MAXTRANSMITTER];
int gameRate;
char graphics[MAXGRAPHICS];
long adress;
};
int main(void) {
FILE *fileDatabase; //Мітка на файл БД.
FILE *fileTemp; //Мітка на тимчасовий файл.
FILE *fileTempInd; //Мітка на тимчасовий індексний файл.
FILE *fileIndex; //Мітка на індексний файл.
char nameOfDatabase[20]; //Буде міститись назва БД.
char nameOfIndexFile[20]; //Буде міститись навза індексного файла.
int menuItem,menuExit=7,menuItemP; // menuItem -для зберігання вибору пункту головного меню
int yes_no; //Змінна для перевірки вибору меню кожного підменю.
int back,backGo; //Змінна для перевірки нажато "0" для виходу в гол. меню.
int recSize=202;
struct game addGame;
system("cls");
do {
system("cls");
printf(" Menu:\n1. Creation a database.\n2. Insert the element in a database (ID).\n3. Delete an element. \n4. Edit after the key field. \n5. Review a database. \n6. Search in the database. \n7. Close a programm.\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItem);
if (menuItem==1) {
menuItemP=0;
printf(" -=CREATION A DATABASE=-");
printf("\n Do you want to create a new database? The old database will be deleted.\n");
printf("1. Yes\n2. No\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItemP);
//**Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
else {
yes_no=0;
}
//*Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
while (yes_no!=1) {
printf("You have not chosen any menu item. Please enter once again: ");
scanf("%d",&menuItemP);
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
}
//*Кінець - Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
//**Кінець - Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1) { //Потрібно створювати базу даних???
printf("\nEnter name of the file (MAX-20): ");
scanf("%s",&nameOfDatabase); //Введення назви файлу бази даних.
strcat(nameOfDatabase,".txt"); //Додавання розширення .txt до імені.
strcpy(nameOfIndexFile,"ind_");
strcat(nameOfIndexFile,nameOfDatabase);
//**Перевірка чи створений файл бази даних чи ні та виведення результату.
if ((fileDatabase=fopen(nameOfDatabase,"w")) == NULL) {
printf("\nAn error is at creation of file. %s.",nameOfDatabase);
}
if ((fileIndex=fopen(nameOfIndexFile,"w")) == NULL) {
printf("\nAn error is at creation of file. %s.",nameOfIndexFile);
}
addNewBlock(fileDatabase);
fprintf(fileIndex,"0 0");
//*Перевірка чи закритий файл бази даних чи ні та виведення результату.
if (fclose(fileIndex) != 0) {
printf("\nAn error is at closing of file %s.",nameOfIndexFile);
}
if (fclose(fileDatabase) != 0) {
printf("\nAn error is at closing of file %s.",nameOfDatabase);
}
}
//**Повернення в головне меню.
printf("\nEnter '0' for returning in a main menu: ");
scanf("%d",&backGo);
while (backGo!=0) {
printf("You have not enter '0'. Please enter once again: ");
scanf("%d",&backGo);
}
//**Кінець - Повернення в головне меню.
back=1; //Вивід головного меню дозволений.
}
else if (menuItem==2) {
printf(" -=ADD A RECORD IN THE DATABASE=-");
printf("\nEnter name of the file (MAX-20): ");
scanf("%s",&nameOfDatabase); //Введення назви файлу бази даних.
strcat(nameOfDatabase,".txt"); //Додавання розширення .txt до імені.
strcpy(nameOfIndexFile,"ind_");
strcat(nameOfIndexFile,nameOfDatabase);
//**Перевірка чи створений файл бази даних чи ні та виведення результату.
if ((fileDatabase=fopen(nameOfDatabase,"r+")) == NULL) {
printf("\nAn error is at opening a file. %s.",nameOfDatabase);
}
if ((fileIndex=fopen(nameOfIndexFile,"r+")) == NULL) {
printf("\nAn error is at creation of file. %s.",nameOfIndexFile);
}
if ((fileTemp=fopen("temp.txt","w")) == NULL) {
printf("\nAn error is at creation of file. %s.",nameOfIndexFile);
}
if ((fileTempInd=fopen("temp_int.txt","w")) == NULL) {
printf("\nAn error is at creation of file. %s.",nameOfIndexFile);
}
//***Введення даних.
int yes_noGameRate=0;
printf("\nEnter next information for a record in a database.");
printf("\n1. Enter ID of the game: ");
scanf("%d",&addGame.ID);
printf("2. Enter platform (MAX-10): ");
scanf("%s",&addGame.platform);
printf("3. Enter name of the game (MAX-40): ");
scanf("%s",&addGame.name);
printf("4. Enter developer (MAX-30): ");
scanf("%s",&addGame.developer);
printf("5. Enter publisher (MAX-30): ");
scanf("%s",&addGame.publisher);
printf("6. Enter release date (MAX-10): ");
scanf("%s",&addGame.releaseDate);
printf("7. Enter genre (MAX-20): ");
scanf("%s",&addGame.genre);
printf("8. Enter homepage (MAX-20): ");
scanf("%s",&addGame.homepage);
printf("9. Enter transmitter (MAX-10): ");
scanf("%s",&addGame.transmitter);
printf("10. Enter graphics (MAX-10): ");
scanf("%s",&addGame.graphics);
printf("11. Enter age (MAX-3): ");
scanf("%d",&addGame.age);
printf("12. Enter game rate (1,2,3,4 or 5): ");
scanf("%d",&addGame.gameRate);
if (addGame.gameRate==1 || addGame.gameRate==2 || addGame.gameRate==3 || addGame.gameRate==4 || addGame.gameRate== 5) {
yes_noGameRate=1;
}
while (yes_noGameRate!=1) {
printf("You have not enter 1, 2, 3, 4 or 5. Please enter once again: ");
scanf("%d",&addGame.gameRate);
if (addGame.gameRate==1 || addGame.gameRate==2 || addGame.gameRate==3 || addGame.gameRate==4 || addGame.gameRate== 5) {
yes_noGameRate=1;
}
}
//***Кінець - Введення даних.
//**Вивід даних.
printf("\n----------------------------------");
printf("\nYour dates:\n");
printf("\nID: %d\nPlatform: %s\nName: %s\nDeveloper: %s\nPublisher: %s\nRelease date: %s\nGenre: %s\nHomepage: %s\nTransmitter: %s\nGraphics: %s\nAge: %d\nGame rate: %d\n",addGame.ID,addGame.platform,addGame.name,addGame.developer,addGame.publisher,addGame.releaseDate,addGame.genre,addGame.homepage,addGame.transmitter,addGame.graphics,addGame.age,addGame.gameRate);
printf("\n----------------------------------\n");
//**Кінець - Вивід даних.
int maxID,nRecords,c,n=0,addRec_yn=0,yn=0,renameInd=0;
long adressN,adressInd;
char words[7];
while(fgets(words,7,fileIndex) != NULL && words[0] != '\n') {
n++;
}
rewind(fileIndex);
printf("\nn=%d",n);
for (int i=0; i<n; i++) {
adressInd=ftell(fileIndex);
fscanf(fileIndex,"%d",&maxID);
c=whatNumber(maxID);
frotSpaces(c,fileIndex);
adressN=ftell(fileIndex);
fscanf(fileIndex,"%d",&nRecords);//Врахувати кынець рядка, якщо не зчиту ты символи, що потрыбно.
printf("\nmaxID=%d, nRecords=%d",maxID,nRecords);
if (maxID==0) {
addNewRecord(addGame,fileDatabase);
fseek(fileIndex,adressInd,SEEK_SET);
fprintf(fileIndex,"%d",addGame.ID);
c=whatNumber(addGame.ID);
addSpaces(c,fileIndex);
fprintf(fileIndex,"%d",nRecords+1);
addRec_yn=1;
}
else {
if (addGame.ID<maxID) {
char record[202];
if (nRecords==1) {
printf("\nDobavlajem v %d blok.",i);
for (int j=0; j<i*4; j++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
addNewRecord(addGame,fileTemp);
fprintf(fileTemp,"\n");
for (int k=0; k<4; k++) {
fgets(record,202,fileDatabase);
if (k<3) {
fprintf(fileTemp,"%s",record);
}
}
while(fgets(record,202,fileDatabase) != NULL && words[0] != '\n') {
fprintf(fileTemp,"%s",record);
}
fseek(fileIndex,adressN,SEEK_SET);
fprintf(fileIndex,"%d",nRecords+1);
addRec_yn=1;
}
else if (nRecords==2) {
int IDB=0; char *endB;
printf("\nDobavlajem v %d blok.",i);
for (int j=0; j<i*4; j++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\n%d",IDB);
if (addGame.ID<IDB) {
addNewRecord(addGame,fileTemp);
fprintf(fileTemp,"\n");
fprintf(fileTemp,"%s",record);
}
else {
fprintf(fileTemp,"%s",record);
addNewRecord(addGame,fileTemp);
fprintf(fileTemp,"\n");
}
for (int k=0; k<3; k++) {
fgets(record,202,fileDatabase);
if (k<2) {
fprintf(fileTemp,"%s",record);
}
}
while(fgets(record,202,fileDatabase) != NULL && words[0] != '\n') {
fprintf(fileTemp,"%s",record);
}
fseek(fileIndex,adressN,SEEK_SET);
fprintf(fileIndex,"%d",nRecords+1);
addRec_yn=1;
}
else if (nRecords==3) {
int IDB=0; char *endB;
printf("\nDobavlajem v %d blok.",i);
for (int j=0; j<i*4; j++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\n%d",IDB);
if (addGame.ID<IDB) {
addNewRecord(addGame,fileTemp);
fprintf(fileTemp,"\n");
fprintf(fileTemp,"%s",record);
for (int k=0; k<3; k++) {
fgets(record,202,fileDatabase);
if (k<2) {
fprintf(fileTemp,"%s",record);
}
}
}
else {
fprintf(fileTemp,"%s",record);
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\n%d",IDB);
if (addGame.ID<IDB) {
addNewRecord(addGame,fileTemp);
fprintf(fileTemp,"\n");
fprintf(fileTemp,"%s",record);
}
else {
fprintf(fileTemp,"%s",record);
addNewRecord(addGame,fileTemp);
fprintf(fileTemp,"\n");
}
for (int k=0; k<2; k++) {
fgets(record,202,fileDatabase);
if (k<1) {
fprintf(fileTemp,"%s",record);
}
}
}
while(fgets(record,202,fileDatabase) != NULL && words[0] != '\n') {
fprintf(fileTemp,"%s",record);
}
fseek(fileIndex,adressN,SEEK_SET);
fprintf(fileIndex,"%d",nRecords+1);
addRec_yn=1;
}
else if (nRecords==4) {
int IDB=0; char *endB;
printf("\nDobavlajem v %d blok.",i);
for (int j=0; j<i*4; j++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\n%d",IDB);
if (addGame.ID<IDB) {
addNewRecord(addGame,fileTemp);
fprintf(fileTemp,"\n");
fprintf(fileTemp,"%s",record);
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
fprintf(fileTemp,"%s",record);
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
for (int k=0; k<2; k++) {
fgets(record,202,fileDatabase);
if (k<2) {
fprintf(fileTemp,"%s",record);
}
}
for (int s=0; s<2; s++) {
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
}
fseek(fileIndex,0L,SEEK_SET);
for (int j=0; j<i; j++) {
fgets(words,7,fileIndex);
fprintf(fileTempInd,"%s",words);
}
fprintf(fileTempInd,"%d",IDB);
c=whatNumber(IDB);
addSpaces(c,fileTempInd);
fprintf(fileTempInd,"3");
fprintf(fileTempInd,"\n");
fgets(words,7,fileIndex);
words[4]='2';
fprintf(fileTempInd,"%s",words);
while(fgets(words,7,fileIndex) != NULL && words[0] != '\n') {
fprintf(fileTempInd,"%s",words);
}
}
else {
fprintf(fileTemp,"%s",record);
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\n%d",IDB);
if (addGame.ID<IDB) {
addNewRecord(addGame,fileTemp);
fprintf(fileTemp,"\n");
fprintf(fileTemp,"%s",record);
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
for (int k=0; k<2; k++) {
fgets(record,202,fileDatabase);
if (k<2) {
fprintf(fileTemp,"%s",record);
}
}
for (int s=0; s<2; s++) {
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
}
fseek(fileIndex,0L,SEEK_SET);
for (int j=0; j<i; j++) {
fgets(words,7,fileIndex);
fprintf(fileTempInd,"%s",words);
}
fprintf(fileTempInd,"%d",IDB);
c=whatNumber(IDB);
addSpaces(c,fileTempInd);
fprintf(fileTempInd,"3");
fprintf(fileTempInd,"\n");
fgets(words,7,fileIndex);
words[4]='2';
fprintf(fileTempInd,"%s",words);
while(fgets(words,7,fileIndex) != NULL && words[0] != '\n') {
fprintf(fileTempInd,"%s",words);
}
}
else {
fprintf(fileTemp,"%s",record);
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\n%d",IDB);
if (addGame.ID<IDB) {
addNewRecord(addGame,fileTemp);
fprintf(fileTemp,"\n");
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
fprintf(fileTemp,"%s",record);
for (int k=0; k<1; k++) {
fgets(record,202,fileDatabase);
if (k<1) {
fprintf(fileTemp,"%s",record);
}
}
for (int s=0; s<2; s++) {
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
}
fseek(fileIndex,0L,SEEK_SET);
for (int j=0; j<i; j++) {
fgets(words,7,fileIndex);
fprintf(fileTempInd,"%s",words);
}
fprintf(fileTempInd,"%d",addGame.ID);
c=whatNumber(addGame.ID);
addSpaces(c,fileTempInd);
fprintf(fileTempInd,"3");
fprintf(fileTempInd,"\n");
fgets(words,7,fileIndex);
words[4]='2';
fprintf(fileTempInd,"%s",words);
while(fgets(words,7,fileIndex) != NULL && words[0] != '\n') {
fprintf(fileTempInd,"%s",words);
}
}
else {
fprintf(fileTemp,"%s",record);
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
addNewRecord(addGame,fileTemp);
fprintf(fileTemp,"\n");
for (int k=0; k<1; k++) {
fgets(record,202,fileDatabase);
if (k<1) {
fprintf(fileTemp,"%s",record);
}
}
for (int s=0; s<2; s++) {
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
}
fseek(fileIndex,0L,SEEK_SET);
for (int j=0; j<i; j++) {
fgets(words,7,fileIndex);
fprintf(fileTempInd,"%s",words);
}
fprintf(fileTempInd,"%d",IDB);
c=whatNumber(IDB);
addSpaces(c,fileTempInd);
fprintf(fileTempInd,"3");
fprintf(fileTempInd,"\n");
fgets(words,7,fileIndex);
words[4]='2';
fprintf(fileTempInd,"%s",words);
while(fgets(words,7,fileIndex) != NULL && words[0] != '\n') {
fprintf(fileTempInd,"%s",words);
}
}
}
}
while(fgets(record,202,fileDatabase) != NULL && words[0] != '\n') {
fprintf(fileTemp,"%s",record);
}
renameInd=1;
addRec_yn=1;
}
yn=1;
}
}
if (addRec_yn==1) {
break;
}
}
if (addRec_yn==0) {
printf("\nIt is needed to create a new block.");
fseek(fileDatabase,0L,SEEK_END);
fprintf(fileDatabase,"\n");
addNewBlock(fileDatabase);
fseek(fileDatabase,n*4*recSize,SEEK_SET);
addNewRecord(addGame,fileDatabase);
fseek(fileIndex,0L,SEEK_END);
fprintf(fileIndex,"\n%d",addGame.ID);
c=whatNumber(addGame.ID);
addSpaces(c,fileIndex);
fprintf(fileIndex,"%d",1);
}
if (fclose(fileTempInd) != 0) {
printf("\nAn error is at closing of file temp.txt.");
}
if (fclose(fileTemp) != 0) {
printf("\nAn error is at closing of file temp.txt.");
}
if (fclose(fileIndex) != 0) {
printf("\nAn error is at closing of file %s.",nameOfIndexFile);
}
if (fclose(fileDatabase) != 0) {
printf("\nAn error is at closing of file %s.",nameOfDatabase);
}
if (yn==1) {
remove(nameOfDatabase);
rename("temp.txt",nameOfDatabase);
if (renameInd==1) {
remove(nameOfIndexFile);
rename("temp_int.txt",nameOfIndexFile);
}
}
//**Повернення в головне меню.
printf("\nEnter '0' for returning in a main menu: ");
scanf("%d",&backGo);
while (backGo!=0) {
printf("You have not enter '0'. Please enter once again: ");
scanf("%d",&backGo);
}
//**Кінець - Повернення в головне меню.
back=1; //Вивід головного меню дозволений.
}
//#########################################################################
else if (menuItem==3) {
printf(" -=DELETE A RECORD IN THE DATABASE=-");
printf("\nEnter name of the file (MAX-20): ");
scanf("%s",&nameOfDatabase); //Введення назви файлу бази даних.
strcat(nameOfDatabase,".txt"); //Додавання розширення .txt до імені.
strcpy(nameOfIndexFile,"ind_");
strcat(nameOfIndexFile,nameOfDatabase);
//**Перевірка чи створений файл бази даних чи ні та виведення результату.
if ((fileDatabase=fopen(nameOfDatabase,"r+")) == NULL) {
printf("\nAn error is at opening a file. %s.",nameOfDatabase);
}
if ((fileIndex=fopen(nameOfIndexFile,"r+")) == NULL) {
printf("\nAn error is at creation of file. %s.",nameOfIndexFile);
}
if ((fileTemp=fopen("temp.txt","w")) == NULL) {
printf("\nAn error is at creation of file. %s.",nameOfIndexFile);
}
if ((fileTempInd=fopen("temp_int.txt","w")) == NULL) {
printf("\nAn error is at creation of file. %s.",nameOfIndexFile);
}
//***Введення даних.
printf("\nEnter next information for a record in a database.");
printf("\nEnter ID of the game: ");
scanf("%d",&addGame.ID);
int maxID,nRecords,c,n=0,deleteRec_yn=0,yn=0,renameInd=0;
long adressN,adressInd;
char words[7];
while(fgets(words,7,fileIndex) != NULL && words[0] != '\n') {
n++;
}
rewind(fileIndex);
printf("\nn=%d",n);
for (int i=0; i<n; i++) {
adressInd=ftell(fileIndex);
fscanf(fileIndex,"%d",&maxID);
c=whatNumber(maxID);
frotSpaces(c,fileIndex);
adressN=ftell(fileIndex);
fscanf(fileIndex,"%d",&nRecords);//Врахувати кынець рядка, якщо не зчиту ты символи, що потрыбно.
printf("\nmaxID=%d, nRecords=%d",maxID,nRecords);
int IDB; char *endB;
if (addGame.ID<maxID || addGame.ID==maxID) {
char record[202];
if (nRecords==1) {
printf("\nVudalajem z %d bloy.",i);
for (int j=0; j<i*4; j++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\nIDB=%d",IDB);
if (IDB==addGame.ID) {
for (int p=0; p<3; p++) {
fgets(record,202,fileDatabase);
}
}
else {
printf("\nTakoho zapusy nema.");
fprintf(fileTemp,"%s",record);
for (int h=0; h<3; h++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
}
while(fgets(record,202,fileDatabase) != NULL && words[0] != '\n') {
fprintf(fileTemp,"%s",record);
}
fseek(fileIndex,0L,SEEK_SET);
for (int s=0; s<i; s++) {
fgets(words,7,fileIndex);
fprintf(fileTempInd,"%s",words);
}
fgets(words,7,fileIndex);
while(fgets(words,7,fileIndex) != NULL && words[0] != '\n') {
fprintf(fileTempInd,"%s",words);
}
renameInd=1;
deleteRec_yn=1;
}
if (nRecords==2) {
printf("\nVudalajem z %d bloky.",i);
for (int j=0; j<i*4; j++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\nIDB=%d",IDB);
int IDB2; IDB2=IDB;
if (IDB==addGame.ID) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
fseek(fileIndex,adressN,SEEK_SET);
fprintf(fileIndex,"%d",nRecords-1);
}
else {
fprintf(fileTemp,"%s",record);
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\nIDB=%d",IDB);
if (IDB==addGame.ID) {
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
fseek(fileIndex,0L,SEEK_SET);
for (int s=0; s<i; s++) {
fgets(words,7,fileIndex);
fprintf(fileTempInd,"%s",words);
}
fprintf(fileTempInd,"%d",IDB2);
c=whatNumber(IDB2);
addSpaces(c,fileTempInd);
fprintf(fileTempInd,"%d",nRecords-1);
fprintf(fileTempInd,"\n");
fgets(words,7,fileIndex);
while(fgets(words,7,fileIndex) != NULL && words[0] != '\n') {
fprintf(fileTempInd,"%s",words);
}
renameInd=1;
}
else {
printf("\nTakoho zapusy nema.");
fprintf(fileTemp,"%s",record);
for (int h=0; h<3; h++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
}
}
while(fgets(record,202,fileDatabase) != NULL && words[0] != '\n') {
fprintf(fileTemp,"%s",record);
}
deleteRec_yn=1;
}
if (nRecords==3) {
printf("\nVudalajem z %d bloky.",i);
for (int j=0; j<i*4; j++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\nIDB=%d",IDB);
int IDB2;
if (IDB==addGame.ID) {
for (int ss=0; ss<2; ss++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
fseek(fileIndex,adressN,SEEK_SET);
fprintf(fileIndex,"%d",nRecords-1);
}
else {
fprintf(fileTemp,"%s",record);
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\nIDB=%d",IDB);
IDB2=IDB;
if (IDB==addGame.ID) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
fseek(fileIndex,adressN,SEEK_SET);
fprintf(fileIndex,"%d",nRecords-1);
}
else {
fprintf(fileTemp,"%s",record);
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\nIDB=%d",IDB);
if (IDB==addGame.ID) {
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
fseek(fileIndex,0L,SEEK_SET);
for (int s=0; s<i; s++) {
fgets(words,7,fileIndex);
fprintf(fileTempInd,"%s",words);
}
fprintf(fileTempInd,"%d",IDB2);
c=whatNumber(IDB2);
addSpaces(c,fileTempInd);
fprintf(fileTempInd,"%d",nRecords-1);
fprintf(fileTempInd,"\n");
fgets(words,7,fileIndex);
while(fgets(words,7,fileIndex) != NULL && words[0] != '\n') {
fprintf(fileTempInd,"%s",words);
}
renameInd=1;
}
else {
printf("\nTakoho zapusy nema.");
fprintf(fileTemp,"%s",record);
for (int h=0; h<3; h++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
}
}
}
while(fgets(record,202,fileDatabase) != NULL && words[0] != '\n') {
fprintf(fileTemp,"%s",record);
}
deleteRec_yn=1;
}
if (nRecords==4) {
printf("\nVudalajem z %d bloky.",i);
for (int j=0; j<i*4; j++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\nIDB=%d",IDB);
int IDB2;
if (IDB==addGame.ID) {
for (int ss=0; ss<3; ss++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
fseek(fileIndex,adressN,SEEK_SET);
fprintf(fileIndex,"%d",nRecords-1);
}
else {
fprintf(fileTemp,"%s",record);
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\nIDB=%d",IDB);
if (IDB==addGame.ID) {
for (int ss=0; ss<2; ss++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
fseek(fileIndex,adressN,SEEK_SET);
fprintf(fileIndex,"%d",nRecords-1);
}
else {
fprintf(fileTemp,"%s",record);
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\nIDB=%d",IDB);
IDB2=IDB;
if (IDB==addGame.ID) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
fseek(fileIndex,adressN,SEEK_SET);
fprintf(fileIndex,"%d",nRecords-1);
}
else {
fprintf(fileTemp,"%s",record);
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\nIDB=%d",IDB);
if (IDB==addGame.ID) {
addSpaces(200,fileTemp);
fprintf(fileTemp,"\n");
fseek(fileIndex,0L,SEEK_SET);
for (int s=0; s<i; s++) {
fgets(words,7,fileIndex);
fprintf(fileTempInd,"%s",words);
}
fprintf(fileTempInd,"%d",IDB2);
c=whatNumber(IDB2);
addSpaces(c,fileTempInd);
fprintf(fileTempInd,"%d",nRecords-1);
fprintf(fileTempInd,"\n");
fgets(words,7,fileIndex);
while(fgets(words,7,fileIndex) != NULL && words[0] != '\n') {
fprintf(fileTempInd,"%s",words);
}
renameInd=1;
}
else {
printf("\nTakoho zapusy nema.");
fprintf(fileTemp,"%s",record);
for (int h=0; h<3; h++) {
fgets(record,202,fileDatabase);
fprintf(fileTemp,"%s",record);
}
}
}
}
}
while(fgets(record,202,fileDatabase) != NULL && words[0] != '\n') {
fprintf(fileTemp,"%s",record);
}
deleteRec_yn=1;
}
yn=1;
}
if (deleteRec_yn==1) {
break;
}
}
if (fclose(fileTempInd) != 0) {
printf("\nAn error is at closing of file temp.txt.");
}
if (fclose(fileTemp) != 0) {
printf("\nAn error is at closing of file temp.txt.");
}
if (fclose(fileIndex) != 0) {
printf("\nAn error is at closing of file %s.",nameOfIndexFile);
}
if (fclose(fileDatabase) != 0) {
printf("\nAn error is at closing of file %s.",nameOfDatabase);
}
if (yn==1) {
remove(nameOfDatabase);
rename("temp.txt",nameOfDatabase);
if (renameInd==1) {
remove(nameOfIndexFile);
rename("temp_int.txt",nameOfIndexFile);
}
}
//**Повернення в головне меню.
printf("\nEnter '0' for returning in a main menu: ");
scanf("%d",&backGo);
while (backGo!=0) {
printf("You have not enter '0'. Please enter once again: ");
scanf("%d",&backGo);
}
//**Кінець - Повернення в головне меню.
back=1; //Вивід головного меню дозволений.
}
else if (menuItem==4) {
printf(" -=EDIT A RECORD IN THE DATABASE=-");
printf("\nEnter name of the file (MAX-20): ");
scanf("%s",&nameOfDatabase); //Введення назви файлу бази даних.
strcat(nameOfDatabase,".txt"); //Додавання розширення .txt до імені.
strcpy(nameOfIndexFile,"ind_");
strcat(nameOfIndexFile,nameOfDatabase);
//**Перевірка чи створений файл бази даних чи ні та виведення результату.
if ((fileDatabase=fopen(nameOfDatabase,"r+")) == NULL) {
printf("\nAn error is at opening a file. %s.",nameOfDatabase);
}
if ((fileIndex=fopen(nameOfIndexFile,"r+")) == NULL) {
printf("\nAn error is at creation of file. %s.",nameOfIndexFile);
}
//***Введення даних.
int yes_noGameRate=0;
printf("\nEnter next information for a record in a database.");
printf("\n1. Enter ID of the game: ");
scanf("%d",&addGame.ID);
int yes_noP=0,menuItemEdit,whatEdit;
while (yes_noP!=1) {
system("cls");
printf("\nWhat you want to edit: ");
printf("\n1. Platform\n2. Name\n3. Developer\n4. Publisher\n5. Release date\n6. Genre\n7. Homepage\n8. Transmitter\n9. Graphics\n10. Age\n11. Game rate\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItemEdit);
if (menuItemEdit==1) {
printf("Enter platform (MAX-10): ");
scanf("%s",&addGame.platform);
whatEdit=1;
yes_noP=1;
}
else if (menuItemEdit==2) {
printf("Enter name (MAX-40): ");
scanf("%s",&addGame.name);
whatEdit=2;
yes_noP=1;
}
else if (menuItemEdit==3) {
printf("Enter Developer (MAX-30): ");
scanf("%s",&addGame.developer);
whatEdit=3;
yes_noP=1;
}
else if (menuItemEdit==4) {
printf("Enter Publisher (MAX-30): ");
scanf("%s",&addGame.publisher);
whatEdit=4;
yes_noP=1;
}
else if (menuItemEdit==5) {
printf("Enter Release date (MAX-10): ");
scanf("%s",&addGame.releaseDate);
whatEdit=5;
yes_noP=1;
}
else if (menuItemEdit==6) {
printf("Enter Genre (MAX-20): ");
scanf("%s",&addGame.genre);
whatEdit=6;
yes_noP=1;
}
else if (menuItemEdit==7) {
printf("Enter Homepage (MAX-20): ");
scanf("%s",&addGame.homepage);
whatEdit=7;
yes_noP=1;
}
else if (menuItemEdit==8) {
printf("Enter Transmitter (MAX-10): ");
scanf("%s",&addGame.transmitter);
whatEdit=8;
yes_noP=1;
}
else if (menuItemEdit==9) {
printf("Enter Graphics (MAX-10): ");
scanf("%s",&addGame.graphics);
whatEdit=9;
yes_noP=1;
}
else if (menuItemEdit==10) {
printf("Enter Age: ");
scanf("%d",&addGame.age);
whatEdit=10;
yes_noP=1;
}
else if (menuItemEdit==11) {
printf("Enter Game Rate: ");
scanf("%d",&addGame.gameRate);
whatEdit=11;
yes_noP=1;
}
}
int maxID,nRecords,c,n=0,editRec_yn=0,yn=0,renameInd=0;
long adressN,adressInd,adressRec;
char words[7];
while(fgets(words,7,fileIndex) != NULL && words[0] != '\n') {
n++;
}
rewind(fileIndex);
printf("\nn=%d",n);
for (int i=0; i<n; i++) {
adressInd=ftell(fileIndex);
fscanf(fileIndex,"%d",&maxID);
c=whatNumber(maxID);
frotSpaces(c,fileIndex);
adressN=ftell(fileIndex);
fscanf(fileIndex,"%d",&nRecords);//Врахувати кынець рядка, якщо не зчиту ты символи, що потрыбно.
printf("\nmaxID=%d, nRecords=%d",maxID,nRecords);
int IDB; char *endB;
if (addGame.ID<maxID || addGame.ID==maxID) {
char record[202];
printf("\nRedahujem v %d blozi.",i);
for (int j=0; j<i*4; j++) {
fgets(record,202,fileDatabase);
}
for(int osn=0; osn<4; osn++) {
adressRec=ftell(fileDatabase);
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\nIDB=%d",IDB);
if (IDB==addGame.ID) {
printf("\nZapus znajdeno.Ura!!!!!!");
fseek(fileDatabase,0L,SEEK_SET);
if (whatEdit==1) {
fseek(fileDatabase,adressRec+4,SEEK_SET);
}
if (whatEdit==2) {
fseek(fileDatabase,adressRec+25,SEEK_SET);
}
if (whatEdit==3) {
fseek(fileDatabase,adressRec+66,SEEK_SET);
}
if (whatEdit==4) {
fseek(fileDatabase,adressRec+97,SEEK_SET);
}
if (whatEdit==5) {
fseek(fileDatabase,adressRec+128,SEEK_SET);
}
if (whatEdit==6) {
fseek(fileDatabase,adressRec+139,SEEK_SET);
}
if (whatEdit==7) {
fseek(fileDatabase,adressRec+160,SEEK_SET);
}
if (whatEdit==8) {
fseek(fileDatabase,adressRec+181,SEEK_SET);
}
if (whatEdit==9) {
fseek(fileDatabase,adressRec+185,SEEK_SET);
}
if (whatEdit==10) {
fseek(fileDatabase,adressRec+196,SEEK_SET);
}
if (whatEdit==11) {
fseek(fileDatabase,adressRec+199,SEEK_SET);
}
editRecord(addGame, fileDatabase, whatEdit);
editRec_yn=1;
}
if (editRec_yn==1) {
break;
}
}
}
if (editRec_yn==1) {
break;
}
}
if (fclose(fileIndex) != 0) {
printf("\nAn error is at closing of file %s.",nameOfIndexFile);
}
if (fclose(fileDatabase) != 0) {
printf("\nAn error is at closing of file %s.",nameOfDatabase);
}
//**Повернення в головне меню.
printf("\nEnter '0' for returning in a main menu: ");
scanf("%d",&backGo);
while (backGo!=0) {
printf("You have not enter '0'. Please enter once again: ");
scanf("%d",&backGo);
}
//**Кінець - Повернення в головне меню.
back=1; //Вивід головного меню дозволений.
}
else if (menuItem==5) {
printf(" -=REWIEW A DATABASE IN THE DATABASE=-");
printf("\nEnter name of the file (MAX-20): ");
scanf("%s",&nameOfDatabase); //Введення назви файлу бази даних.
strcat(nameOfDatabase,".txt"); //Додавання розширення .txt до імені.
strcpy(nameOfIndexFile,"ind_");
strcat(nameOfIndexFile,nameOfDatabase);
//**Перевірка чи створений файл бази даних чи ні та виведення результату.
if ((fileDatabase=fopen(nameOfDatabase,"r+")) == NULL) {
printf("\nAn error is at opening a file. %s.",nameOfDatabase);
}
if ((fileIndex=fopen(nameOfIndexFile,"r+")) == NULL) {
printf("\nAn error is at creation of file. %s.",nameOfIndexFile);
}
//***Введення даних.
int yes_noGameRate=0;
printf("\nEnter next information for a record in a database.");
printf("\nEnter max ID of the block: ");
scanf("%d",&addGame.ID);
int maxID,nRecords,c,n=0,searchRec_yn=0,yn=0,renameInd=0;
long adressN,adressInd,adressRec;
char words[7];
while(fgets(words,7,fileIndex) != NULL && words[0] != '\n') {
n++;
}
rewind(fileIndex);
printf("\nn=%d",n);
for (int i=0; i<n; i++) {
adressInd=ftell(fileIndex);
fscanf(fileIndex,"%d",&maxID);
c=whatNumber(maxID);
frotSpaces(c,fileIndex);
adressN=ftell(fileIndex);
fscanf(fileIndex,"%d",&nRecords);//Врахувати кынець рядка, якщо не зчиту ты символи, що потрыбно.
printf("\nmaxID=%d, nRecords=%d",maxID,nRecords);
int IDB; char *endB;
if (addGame.ID==maxID) {
char record[202];
printf("\nRedahujem v %d blozi.",i);
for (int j=0; j<i*4; j++) {
fgets(record,202,fileDatabase);
}
for(int osn=0; osn<4; osn++) {
adressRec=ftell(fileDatabase);
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\nIDB=%d",IDB);
if (IDB>0) {
printf("\nZapus znajdeno.Ura!!!!!!");
fseek(fileDatabase,adressRec,SEEK_SET);
searchRecord(fileDatabase);
searchRec_yn=1;
}
fseek(fileDatabase,adressRec+202,SEEK_SET);
}
}
if (searchRec_yn==1) {
break;
}
}
if (fclose(fileIndex) != 0) {
printf("\nAn error is at closing of file %s.",nameOfIndexFile);
}
if (fclose(fileDatabase) != 0) {
printf("\nAn error is at closing of file %s.",nameOfDatabase);
}
//**Повернення в головне меню.
printf("\nEnter '0' for returning in a main menu: ");
scanf("%d",&backGo);
while (backGo!=0) {
printf("You have not enter '0'. Please enter once again: ");
scanf("%d",&backGo);
}
//**Кінець - Повернення в головне меню.
back=1; //Вивід головного меню дозволений.
}
//###########################################################
else if (menuItem==6) {
printf(" -=SEARCH A RECORD IN THE DATABASE=-");
printf("\nEnter name of the file (MAX-20): ");
scanf("%s",&nameOfDatabase); //Введення назви файлу бази даних.
strcat(nameOfDatabase,".txt"); //Додавання розширення .txt до імені.
strcpy(nameOfIndexFile,"ind_");
strcat(nameOfIndexFile,nameOfDatabase);
//**Перевірка чи створений файл бази даних чи ні та виведення результату.
if ((fileDatabase=fopen(nameOfDatabase,"r+")) == NULL) {
printf("\nAn error is at opening a file. %s.",nameOfDatabase);
}
if ((fileIndex=fopen(nameOfIndexFile,"r+")) == NULL) {
printf("\nAn error is at creation of file. %s.",nameOfIndexFile);
}
//***Введення даних.
int yes_noGameRate=0;
printf("\nEnter next information for a record in a database.");
printf("\n1. Enter ID of the game: ");
scanf("%d",&addGame.ID);
int maxID,nRecords,c,n=0,searchRec_yn=0,yn=0,renameInd=0;
long adressN,adressInd,adressRec;
char words[7];
while(fgets(words,7,fileIndex) != NULL && words[0] != '\n') {
n++;
}
rewind(fileIndex);
printf("\nn=%d",n);
for (int i=0; i<n; i++) {
adressInd=ftell(fileIndex);
fscanf(fileIndex,"%d",&maxID);
c=whatNumber(maxID);
frotSpaces(c,fileIndex);
adressN=ftell(fileIndex);
fscanf(fileIndex,"%d",&nRecords);//Врахувати кынець рядка, якщо не зчиту ты символи, що потрыбно.
printf("\nmaxID=%d, nRecords=%d",maxID,nRecords);
int IDB; char *endB;
if (addGame.ID<maxID || addGame.ID==maxID) {
char record[202];
printf("\nRedahujem v %d blozi.",i);
for (int j=0; j<i*4; j++) {
fgets(record,202,fileDatabase);
}
for(int osn=0; osn<4; osn++) {
adressRec=ftell(fileDatabase);
fgets(record,202,fileDatabase);
IDB=strtol(record,&endB,10);
printf("\nIDB=%d",IDB);
if (IDB==addGame.ID) {
printf("\nZapus znajdeno.Ura!!!!!!");
fseek(fileDatabase,adressRec,SEEK_SET);
searchRecord(fileDatabase);
searchRec_yn=1;
}
if (searchRec_yn==1) {
break;
}
}
}
if (searchRec_yn==1) {
break;
}
}
if (fclose(fileIndex) != 0) {
printf("\nAn error is at closing of file %s.",nameOfIndexFile);
}
if (fclose(fileDatabase) != 0) {
printf("\nAn error is at closing of file %s.",nameOfDatabase);
}
//**Повернення в головне меню.
printf("\nEnter '0' for returning in a main menu: ");
scanf("%d",&backGo);
while (backGo!=0) {
printf("You have not enter '0'. Please enter once again: ");
scanf("%d",&backGo);
}
//**Кінець - Повернення в головне меню.
back=1; //Вивід головного меню дозволений.
}
else if (menuItem==7) {
printf("Good bye!!!\n");
}
} while (menuItem != menuExit);
return 0;
}
//Функція - Додавання пробілів.
void addSpaces(int n,FILE *f) {
for(int i=0; i<n; i++) {
fprintf(f," ");
}
}
//Функція - Зчитування пробілів.
void frotSpaces(int n, FILE *fpc) {
for(int i=0; i<n; i++) {
fscanf(fpc,"%с");
}
}
//Функція - Визначення, яке число <10,<100,<1000.
int whatNumber(int n) {
int num;
if (n<10) {
num=3;
}
else if (n>=10 && n<100) {
num=2;
}
else if (n>=100 && n<1000) {
num=1;
}
return num;
}
//Функція - Додавання нового блоку.
void addNewBlock(FILE *fp) {
for (int i=0; i<4; i++) {
addSpaces(200,fp);
if (i != 3) {
fprintf(fp,"\n");
}
}
}
//Функція - Додавання запису.
void addNewRecord(struct game add,FILE *fp) {
int k;
fprintf(fp,"%d",add.ID);
k=whatNumber(add.ID);
addSpaces(k,fp);
fprintf(fp,"%s",add.platform); k=21-strlen(add.platform);
addSpaces(k,fp);
fprintf(fp,"%s",add.name); k=41-strlen(add.name);
addSpaces(k,fp);
fprintf(fp,"%s",add.developer); k=31-strlen(add.developer);
addSpaces(k,fp);
fprintf(fp,"%s",add.publisher); k=31-strlen(add.publisher);
addSpaces(k,fp);
fprintf(fp,"%s",add.releaseDate); k=11-strlen(add.releaseDate);
addSpaces(k,fp);
fprintf(fp,"%s",add.genre); k=21-strlen(add.genre);
addSpaces(k,fp);
fprintf(fp,"%s",add.homepage); k=21-strlen(add.homepage);
addSpaces(k,fp);
fprintf(fp,"%s",add.transmitter); k=4-strlen(add.transmitter);
addSpaces(k,fp);
fprintf(fp,"%s",add.graphics); k=11-strlen(add.graphics);
addSpaces(k,fp);
fprintf(fp,"%d",add.age);
if (add.age<10) {
k=2;
}
else if (add.age>=10 || add.age<100) {
k=1;
}
addSpaces(k,fp);
fprintf(fp,"%d",add.gameRate);
}
//Функція - Редагування запису.
void editRecord(struct game add, FILE *fileDatabase, int whatEdit) {
printf("\nVxid y vunkizijy je!!!!!!!!!!!!");
int k;
printf("\n##whatEdit=%d",whatEdit);
if (whatEdit==1) {
fprintf(fileDatabase,"%s",add.platform); k=21-strlen(add.platform);
addSpaces(k,fileDatabase);
}
if (whatEdit==2) {
fprintf(fileDatabase,"%s",add.name); k=41-strlen(add.name);
addSpaces(k,fileDatabase);
}
if (whatEdit==3) {
fprintf(fileDatabase,"%s",add.developer); k=31-strlen(add.developer);
addSpaces(k,fileDatabase);
}
if (whatEdit==4) {
fprintf(fileDatabase,"%s",add.publisher); k=31-strlen(add.publisher);
addSpaces(k,fileDatabase);
}
if (whatEdit==5) {
fprintf(fileDatabase,"%s",add.releaseDate); k=11-strlen(add.releaseDate);
addSpaces(k,fileDatabase);
}
if (whatEdit==6) {
fprintf(fileDatabase,"%s",add.genre); k=21-strlen(add.genre);
addSpaces(k,fileDatabase);
}
if (whatEdit==7) {
fprintf(fileDatabase,"%s",add.homepage); k=21-strlen(add.homepage);
addSpaces(k,fileDatabase);
}
if (whatEdit==8) {
fprintf(fileDatabase,"%s",add.transmitter); k=4-strlen(add.transmitter);
addSpaces(k,fileDatabase);
}
if (whatEdit==9) {
fprintf(fileDatabase,"%s",add.graphics); k=11-strlen(add.graphics);
addSpaces(k,fileDatabase);
}
if (whatEdit==10) {
fprintf(fileDatabase,"%d",add.age);
if (add.age<10) {
k=2;
}
else if (add.age>=10) {
k=1;
}
addSpaces(k,fileDatabase);
}
if (whatEdit==11) {
fprintf(fileDatabase,"%d",add.gameRate);
}
}
//Функція - Пошуку в бази даних.
void searchRecord(FILE *fileDatabase) {
struct game reviewGame;
fscanf(fileDatabase,"%d",&reviewGame.ID);
int k;
if (reviewGame.ID<10) {
k=3;
}
else if (reviewGame.ID>=10 && reviewGame.ID<100) {
k=2;
}
else if (reviewGame.ID>100 || reviewGame.ID==100) {
k=1;
}
frotSpaces(k,fileDatabase);
fscanf(fileDatabase,"%s",&reviewGame.platform); k=21-strlen(reviewGame.platform);
frotSpaces(k,fileDatabase);
fscanf(fileDatabase,"%s",&reviewGame.name); k=41-strlen(reviewGame.name);
frotSpaces(k,fileDatabase);
fscanf(fileDatabase,"%s",&reviewGame.developer); k=31-strlen(reviewGame.developer);
frotSpaces(k,fileDatabase);
fscanf(fileDatabase,"%s",&reviewGame.publisher); k=31-strlen(reviewGame.publisher);
frotSpaces(k,fileDatabase);
fscanf(fileDatabase,"%s",&reviewGame.releaseDate); k=11-strlen(reviewGame.releaseDate);
frotSpaces(k,fileDatabase);
fscanf(fileDatabase,"%s",&reviewGame.genre); k=21-strlen(reviewGame.genre);
frotSpaces(k,fileDatabase);
fscanf(fileDatabase,"%s",&reviewGame.homepage); k=21-strlen(reviewGame.homepage);
frotSpaces(k,fileDatabase);
fscanf(fileDatabase,"%s",&reviewGame.transmitter); k=4-strlen(reviewGame.transmitter);
frotSpaces(k,fileDatabase);
fscanf(fileDatabase,"%s",&reviewGame.graphics); k=11-strlen(reviewGame.graphics);
frotSpaces(k,fileDatabase);
fscanf(fileDatabase,"%d",&reviewGame.age);
if (reviewGame.age<10) {
k=2;
}
else if (reviewGame.age>=10 || reviewGame.age<100) {
k=1;
}
frotSpaces(k,fileDatabase);
fscanf(fileDatabase,"%d",&reviewGame.gameRate);
printf("\n----------------------------------");
printf("\nYour dates:\n");
printf("\nID: %d\nPlatform: %s\nName: %s\nDeveloper: %s\nPublisher: %s\nRelease date: %s\nGenre: %s\nHomepage: %s\nTransmitter: %s\nGraphics: %s\nAge: %d\nGame rate: %d\n",reviewGame.ID,reviewGame.platform,reviewGame.name,reviewGame.developer,reviewGame.publisher,reviewGame.releaseDate,reviewGame.genre,reviewGame.homepage,reviewGame.transmitter,reviewGame.graphics,reviewGame.age,reviewGame.gameRate);
printf("\n----------------------------------\n");
}
Результати виконання програми:
Висновок:
Виконавши дану лабораторну роботу я розглянув органiзацiю i ведення файлiв iндексно-послiдовного доступу; набув практичнi навички у програмуваннi алгоритмiв iндексно-послiдовного доступу до файлiв на зовнiшнiх запам'ятовуючих пристроях.