224 lines
5.0 KiB
C
224 lines
5.0 KiB
C
#include "Lib.h"
|
|
|
|
#define APPEND_BINARY "a+b"
|
|
#define FILE_NAME "starship.dat"
|
|
#define PRINT "print"
|
|
#define EXIT "exit"
|
|
#define CREATE "create"
|
|
#define UPDATE "update"
|
|
|
|
typedef struct
|
|
{
|
|
int id;
|
|
char name[8];
|
|
char star_name[15];
|
|
int age;
|
|
} alien;
|
|
|
|
|
|
// -------------------------------------------------------
|
|
|
|
/* close file */
|
|
int CloseFile(FILE * fp)
|
|
{
|
|
return (fclose(fp));
|
|
}
|
|
|
|
/* print alien */
|
|
void PrintAlien(alien * aln)
|
|
{
|
|
printf("ID : %d\nName : %s\nStar Name : %s\nAlien age : %d\n\n",
|
|
aln->id, aln->name, aln->star_name, aln->age);
|
|
}
|
|
|
|
/* get all data from file */
|
|
void GetAllDataFromFile(alien ** aln_arr)
|
|
{
|
|
alien * aln_data;
|
|
FILE * fp = fopen(FILE_NAME , APPEND_BINARY);
|
|
*aln_arr = (alien *)malloc((ftell(fp) / sizeof(alien)) + (TWO * sizeof(alien)));
|
|
aln_data = *aln_arr;
|
|
rewind(fp);
|
|
while (!feof(fp));
|
|
{
|
|
fread(aln_data, sizeof(alien), ONE, fp);
|
|
aln_data++;
|
|
}
|
|
aln_data->id = ZERO;
|
|
fclose(fp); // fix
|
|
}
|
|
|
|
/* print aliens in arr */
|
|
void PrintArrayAliens(alien * arr_alien)
|
|
{
|
|
while (arr_alien->id != ZERO)
|
|
{
|
|
PrintAlien(arr_alien);
|
|
arr_alien++;
|
|
}
|
|
}
|
|
|
|
/* print data */
|
|
void PrintAllAlienData()
|
|
{
|
|
alien * aliens_data;
|
|
GetAllDataFromFile(&aliens_data);
|
|
PrintArrayAliens(aliens_data);
|
|
free(aliens_data);
|
|
OutputErrorOpenReadFile();
|
|
|
|
}
|
|
|
|
/* write in file */
|
|
void WriteInFile(alien * aln, unsigned int location)
|
|
{
|
|
FILE * fp = fopen(FILE_NAME , APPEND_BINARY);
|
|
fseek(fp, (sizeof(alien) * location), SEEK_SET);
|
|
fwrite(aln, sizeof(alien), ONE, fp);
|
|
CloseFile(fp);
|
|
}
|
|
|
|
/* check if the alien is exists in file */
|
|
BOOLEAN ValueExistsInFile(alien * aln)
|
|
{
|
|
alien * temp_aln = (alien *)malloc(sizeof(alien));
|
|
FILE * fp = fopen(FILE_NAME , APPEND_BINARY);
|
|
fseek(fp, ZERO, SEEK_SET);
|
|
while (fread(temp_aln, sizeof(alien), ONE, fp) > ZERO && temp_aln->id != aln->id);
|
|
CloseFile(fp);
|
|
return (temp_aln->id == aln->id);
|
|
}
|
|
|
|
/* Get the pointer of alien in file */
|
|
unsigned int GetLocationValueInFile(alien * aln)
|
|
{
|
|
FILE * fp;
|
|
unsigned int count = -ONE;
|
|
alien * temp_aln = (alien *)malloc(sizeof(alien));;
|
|
fp = fopen(FILE_NAME , APPEND_BINARY);
|
|
fseek(fp, ZERO, SEEK_SET);
|
|
while (fread(temp_aln, sizeof(alien), ONE, fp) > ZERO && temp_aln->id != aln->id)
|
|
{
|
|
count++;
|
|
}
|
|
CloseFile(fp);
|
|
return count;
|
|
}
|
|
|
|
void GetInputIdAlien(alien * aln)
|
|
{
|
|
int id;
|
|
printf("Enter ID: ");
|
|
scanf("%d", &id);
|
|
aln->id = id;
|
|
}
|
|
|
|
void GetInputNameAlien(alien * aln)
|
|
{
|
|
printf("Enter name: ");
|
|
scanf("%s", (aln->name));
|
|
}
|
|
|
|
void GetInputStarNameAlien(alien * aln)
|
|
{
|
|
printf("Enter star name: ");
|
|
scanf("%s", (aln->star_name));
|
|
}
|
|
|
|
void GetInputAgeAlien(alien * aln)
|
|
{
|
|
int age;
|
|
printf("Enter age: ");
|
|
scanf("%d", &age);
|
|
aln->age = age;
|
|
}
|
|
|
|
void GetInputUpdateAlien(alien * aln)
|
|
{
|
|
GetInputNameAlien(aln);
|
|
GetInputStarNameAlien(aln);
|
|
GetInputAgeAlien(aln);
|
|
}
|
|
|
|
void GetInputAlien(alien * aln)
|
|
{
|
|
GetInputIdAlien(aln);
|
|
GetInputUpdateAlien(aln);
|
|
}
|
|
|
|
/* create data */
|
|
void CreateData(alien * aln)
|
|
{
|
|
unsigned int location;
|
|
alien temp = *aln;
|
|
if (!ValueExistsInFile(&temp))
|
|
{
|
|
location = GetLocationValueInFile(aln) + ONE;
|
|
WriteInFile(aln, location);
|
|
}
|
|
else
|
|
{
|
|
printf("The alien is exists already!\n");
|
|
}
|
|
}
|
|
|
|
/* update data */
|
|
void UpdateData(alien * aln)
|
|
{
|
|
if (ValueExistsInFile(aln))
|
|
{
|
|
GetInputUpdateAlien(aln);
|
|
WriteInFile(aln, GetLocationValueInFile(aln));
|
|
}
|
|
else
|
|
{
|
|
printf("The alien is not exists!\n");
|
|
}
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------------------
|
|
// Project
|
|
// -------
|
|
//
|
|
//---------------------------------------------------------------------------------------
|
|
// Programmer : Cohen Idan
|
|
// Student No : 211675038
|
|
// Date : 19.12.2019
|
|
//---------------------------------------------------------------------------------------
|
|
void main(void)
|
|
{
|
|
string command = " ";
|
|
alien aln;
|
|
int id = ZERO;
|
|
string exit_command = EXIT;
|
|
string print_command = PRINT;
|
|
string create_command = CREATE;
|
|
string update_command = UPDATE;
|
|
|
|
while (!StringCompare(command, exit_command))
|
|
{
|
|
// print request for command
|
|
printf("Enter command (\"print\", \"create\", \"update\" and \"exit\"): ");
|
|
|
|
// Input command
|
|
scanf("%s", command);
|
|
if (StringCompare(command, print_command))
|
|
{
|
|
PrintAllAlienData();
|
|
}
|
|
else if (StringCompare(command, create_command))
|
|
{
|
|
/* get input from user about new alien */
|
|
/* if alien is not exists create new alien else output error */
|
|
GetInputAlien(&aln);
|
|
CreateData(&aln);
|
|
}
|
|
else if (StringCompare(command, update_command))
|
|
{
|
|
GetInputIdAlien(&aln);
|
|
UpdateData(&aln);
|
|
}
|
|
}
|
|
|
|
} |