Files
college-C/Projects/תרץ1/ex13a.c
2022-02-25 15:33:16 +02:00

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);
}
}
}