Monday 17 April 2017

A C database that uses a dynamic array.


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>

typedef struct addr_list{
char name[40];
char street[40];
char district[40];
char town[40];
char county[40];
char country[40];
char postcode[40];
char telno[40];
char email[40];
}addr_list; 
int counter;

struct addr_list **recordarray;
struct addr_list ***pointer = &recordarray;

void readLine(char buffer[]);
void enter(void), txtoutput(void), list(void);
void delete(void);
void load(void), save(void);
void swap(int u, int v), sort(void), search(void);
void endprog(void);
int main(void)
{

int choice;
char s[80];
counter = 0;
struct addr_list **recordarray = calloc(counter, sizeof(struct addr_list *));
for(;;) {
printf("\n");
printf("1.  Create a record\n");
printf("2.  Delete a record\n");
printf("3.  List the file\n");
printf("4.  Save the file\n");
printf("5.  Load the file\n");
printf("6.  Sort the file\n");
printf("7.  Search\n");
printf("8.  Output to a text file for printing or import into wp\n");
printf("9.  Quit\n");
printf("\n");
do {
printf("\nEnter your choice: ");
readLine(s);
choice=atoi(s);
}while(choice < 0 && choice > 11);
switch(choice) {
case 1: enter();
break;
case 2: delete();
break;
case 3: list();
break;
case 4: save();
break;
case 5: load();
break;
case 6: sort();
break;
case 7: search();
break;
case 8: txtoutput();
break;
case 9: endprog();
}
}
return 0;
}


void enter(void)
{
int i;
counter = counter + 1;
i =counter;
recordarray = realloc(* pointer, counter * sizeof(struct addr_list));
recordarray[i] =  malloc(sizeof(addr_list));

if(!recordarray[i])
{
printf("Memory request failed\n");
return;
}   
printf("Enter information on new customer\n");

printf("Enter name: ");
readLine(recordarray[i]->name);

printf("Enter street: ");
readLine(recordarray[i]->street);

printf("Enter district / parish: ");
readLine(recordarray[i]->district);

printf("Enter town / city: ");
readLine(recordarray[i]->town);

printf("Enter county: ");
readLine(recordarray[i]->county);

printf("Enter country: ");
readLine(recordarray[i]->country);

printf("Enter postcode: ");
readLine(recordarray[i]->postcode);

printf("Enter telephone number: ");
readLine(recordarray[i]->telno);

printf("Enter email address: ");
readLine(recordarray[i]->email);

printf("\nMemory at %i bytes after reading.\n", counter * sizeof(**recordarray));
}

void delete(void)
{
int t;
int u;
printf("\nenter a record number #: ");
scanf("%i", &t);
getchar();
for(u=t; u<=counter; u++){
recordarray[u] = recordarray[u+1];
}
counter = counter -1;
recordarray = realloc(* pointer, counter * sizeof(struct addr_list));
printf("\nRecord number %i deleted.\n",t);
printf("\nMemory at %i bytes after deletion.\n", counter * sizeof(**recordarray));
}

void list(void)
{
register int t;
int count;
count = 0;
for(t=1; t<=counter; t++)
{
count = count + 1;
printf("Record number: %i\n",count);
printf("%s\n", (*pointer)[t]->name);
printf("%s\n", (*pointer)[t]->street);
printf("%s\n", (*pointer)[t]->district);
printf("%s\n", (*pointer)[t]->town);
printf("%s\n", (*pointer)[t]->county);
printf("%s\n", (*pointer)[t]->country);
printf("%s\n", (*pointer)[t]->postcode);
printf("%s\n", (*pointer)[t]->telno);
printf("%s\n", (*pointer)[t]->email);
printf("\n");
}
}

void sort(void)
{
register int u;
register int v;
for(u=1; u<counter; u++)
for (v=u+1; v<=counter; v++){
if( strcmp(recordarray[u]->name, recordarray[v]->name) >0){
swap(u, v);
}
}
printf("\nRecords sorted.\n");
}

void swap(int u, int v)
{
struct addr_list *temp;
temp = recordarray[u];
recordarray[u] = recordarray[v];
recordarray[v] = temp;
}

void save(void)
{
FILE *file1;
FILE *fp;
register int i;
if((file1=fopen("filesize", "w"))==NULL) {
printf("Cannot open file.\n");
return;
}
fprintf(file1,"%d\n",counter); 
fclose(file1);

if((fp=fopen("maillist", "wb"))==NULL) {
printf("Cannot open file.\n");
return;
}
for(i=1; i<=counter; i++)
if(recordarray[i]->name)
if(fwrite((*pointer)[i], sizeof(addr_list), 1, fp)!=1)
{
printf("File write error.\n");
fclose(fp);
return;
}
printf("\n%i records saved to file.\n", counter);
fclose(fp);
}




void load(void)
{
FILE *fp;
FILE *file1;
register int i;
if((file1=fopen("filesize", "r"))==NULL) {
printf("Cannot open file,\n");
return;
}
fscanf(file1,"%i", &counter);
fclose(file1);

if((fp=fopen("maillist", "rb"))==NULL) {
printf("Cannot open file.\n");
counter = 0;
return;
}
recordarray = realloc(* pointer, counter * sizeof(addr_list));
for(i=1;  i<=counter; i++){
recordarray[i] =  malloc(sizeof(addr_list));

if(!recordarray[i])
{
printf("Out of memory.\n");
return;
}
if(fread((*pointer)[i], sizeof(addr_list), 1, fp)!=1) {
printf("File read error.\n");
fclose(fp);
return;
}
}
printf("\n%i records loaded.\n",counter);
printf("\nMemory at %i bytes after reading.\n", counter * sizeof(**recordarray));
fclose(fp);
}


void txtoutput(void)
{
int t;
int count;
FILE *stream;
char filename[30];
count = 0;
printf("Enter a file name.\n");
scanf("%s",filename);
printf("\n");
stream = fopen(filename, "w+");
for(t=1; t<=counter; t++) {
if((*pointer)[t]->name[0]) {
count = count +1;
fprintf(stream,"%i\n",count); 
fprintf(stream,"%s\n", (*pointer)[t]->name);
fprintf(stream,"%s\n", (*pointer)[t]->street);
fprintf(stream,"%s\n", (*pointer)[t]->district);
fprintf(stream,"%s\n", (*pointer)[t]->town);
fprintf(stream,"%s\n", (*pointer)[t]->county);
fprintf(stream,"%s\n", (*pointer)[t]->country);
fprintf(stream,"%s\n", (*pointer)[t]->postcode);
fprintf(stream,"%s\n", (*pointer)[t]->telno);
fprintf(stream,"%s\n", (*pointer)[t]->email);
fprintf(stream,"\n");
}
}
fclose(stream);
return;
}

void search(void)
{
int i;
int count;
int flag = 0;
char s[40];
count=0;
printf("\nEnter a name.\n");
readLine(s);
for(i=1;i<=counter;i++)
{
if(recordarray[i]->name[0]) {
count = count +1;
}

if (strcmp(s, recordarray[i]->name)==0)
{
flag = 1;
printf("\nRecord number: %i\n", count);
printf("\nName: %s\n",(*pointer)[i]->name);
printf("\nStreet: %s\n",(*pointer)[i]->street);
printf("\nDistrict: %s\n",(*pointer)[i]->district);
printf("\nTown: %s\n",(*pointer)[i]->town);
printf("\nCounty: %s\n",(*pointer)[i]->county);
printf("\nCountry: %s\n",(*pointer)[i]->country);
printf("\nPostcode:%s\n",(*pointer)[i]->postcode);
printf("\nTelephone number: %s\n",(*pointer)[i]->telno);
printf("\nEmail address: %s\n",(*pointer)[i]->email);
printf("\n");
}
}
if(flag == 0) printf("Record not found.\n");
}

void readLine(char buffer[])
{
char character;
int i=0;
do
{
character=getchar();
buffer[i]=character;
++i;
}
while(character !='\n');
buffer[i-1]='\0';
}

void endprog(void)
{
    free(*pointer);
    exit(0);
}

No comments:

Post a Comment