#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <malloc.h>
const int SIZE = 10;
typedef struct Item
{
int key;
char *info;
} Item;
typedef struct Table
{
Item mas[SIZE];
int busy;
FILE *filetab;
char *filename;
} Table;
char *getStr();
int getInt();
int insert(Table *, int, char *);
int delItem(Table *, int);
int find(Table *, int);
void putTable(Table *);
void delTable(Table *);
int readFile(struct Table *ptab);
void addFile(struct Table *, int , const char *);
void saveFile(struct Table *);
const char *msgs[] = {"0. Quit", "1. Add", "2. Find", "3. Delete", "4. Show"};
const int NMsgs = sizeof(msgs) / sizeof(msgs[0]);
int dialog(const char *msgs[], int);
int D_Add(Table *),
D_Find(Table *),
D_Delete(Table *),
D_Show(Table *);
int (*fptr[])(Table *) = {NULL, D_Add, D_Find, D_Delete, D_Show};
int main()
{
Table table = {NULL};
int rc;
puts("Enter name of file: ");
(table.filename)=getStr();
if(!readFile(&table))
puts("Your data is damaged. File will be rewrited. \n");
while(rc = dialog(msgs, NMsgs))
if(!fptr[rc](&table))
break;
saveFile(&table);
printf("That's all. Bye!\n");
delTable(&table);
return 0;
}
int readFile(struct Table *ptab){
int key, len;
char *info;
if(ptab->filetab = (fopen(ptab->filename, "rb")))
{
while(fread(&key, sizeof(int), 1, ptab->filetab)!=-1 && !feof(ptab->filetab))
{
if(fread(&len, sizeof(int), 1, ptab->filetab)==-1)
return 0;
info = (char*)malloc(sizeof(char)*(len+1));
if(fread(info, sizeof(char), len, ptab->filetab)!=len)
return 0;
*(info + len) ='\0';
insert(ptab, key, info);
}
fclose(ptab->filetab);
}
ptab->filetab=fopen(ptab->filename, "ab");
return 1;
}
void saveFile(struct Table *ptab)
{
int i;
fclose(ptab->filetab);
ptab->filetab=fopen(ptab->filename,"wb+");
for(i=0; i<ptab->busy; i++)
{
addFile(ptab, ptab->mas[i].key, ptab->mas[i].info);
}
fclose(ptab->filetab);
}
void addFile(struct Table *ptab, int key, const char *inf)
{
int len=strlen(inf);
fwrite(&key,sizeof(int), 1, ptab->filetab);
fwrite(&len, sizeof(int), 1, ptab->filetab);
fwrite(inf, sizeof(char), len, ptab->filetab);
}
int dialog(const char *msgs[], int N)
{
char *errmsg = "";
int rc;
int i, n;
do{
puts(errmsg);
errmsg = "You are wrong. Repeate, please!";
for(i = 0; i < N; ++i)
puts(msgs[i]);
puts("Make your choice: --> ");
rc = getInt();
} while(rc < 0 || rc >= N);
return rc;
}
void delTable(Table *ptab)
{
int i;
for(i=0; i<ptab->busy; i++)
free(ptab->mas[i].info);
}
int getInt()
{
int res;
while(!scanf("%d", &res))
scanf("%*c");
scanf("%*c");
return res;
}
char *getStr()
{
char buf[21];
char *ptr=(char*)malloc(1);
int len=0, cutlen, n;
*ptr='\0';
do {
n=scanf("%20[^\n]", buf);
if(n<0)
{
free(ptr);
ptr=NULL;
continue;
}
if(n>0)
{
cutlen=strlen(buf);
len+=cutlen;
ptr=(char*)realloc(ptr,len+1);
strcat(ptr, buf);
}
else
scanf("%*c");
}while(n>0);
return ptr;
}
int find(Table *ptab, int k)
{
int j, i=0, m=ptab->busy-1;
while(i<=m)
{
j=(m+i)/2;
if(ptab->mas[j].key==k)
return j;
if(ptab->mas[j].key<k)
i=j+1;
else
m=j-1;
}
return -1;
}
int insert(Table *ptab, int k, char *info)
{
int i;
if(find(ptab, k)!=-1)
return 0;
if(ptab->busy==SIZE)
return -1;
i=ptab->busy-1;
while(i>=0 && ptab->mas[i].key>k)
{
ptab->mas[i+1]=ptab->mas[i];
i=i-1;
}
ptab->mas[i+1].key=k;
ptab->mas[i+1].info=info;
ptab->busy=ptab->busy+1;
return 1;
}
int D_Add(Table *ptab)
{
int k, rc, n;
char *info = NULL;
puts("Enter key: -->");
do
{
k = getInt();
}while(k<=0);
puts("Enter info:\n");
info = getStr();
if(info == NULL)
return 0;
rc = insert(ptab, k, info);
if(rc && rc!=-1)
puts("Ok\n");
else if(!rc)
printf("Duplicate key: %d\n", k);
else
puts("Table if full");
addFile(ptab, k, info);
return 1;
}
int FindAndInsert(Table *ptab, int k1, int k2)
{
Table newtab = {NULL};
int rc;
if(k1>k2)
{
rc=k1;
k1=k2;
k2=rc;
}
while(k1<=k2)
{
if((rc=find(ptab, k1))!=-1)
insert(&newtab,ptab->mas[rc].key,ptab->mas[rc].info);
k1++;
}
putTable(&newtab);
return 1;
}
int D_Find(Table *ptab)
{
int key1,key2, rc;
puts("Enter first key: ");
do
{
key1 = getInt();
}while(key1<=0);
puts("Enter second key: ");
do
{
key2 = getInt();
}while(key2<=0);
rc=FindAndInsert(ptab, key1, key2);
return 1;
}
int D_Delete(Table *ptab)
{
int k, rc;
puts("Enter key: -->");
do
{
k = getInt();
}while(k<=0);
if((rc=find(ptab, k))==-1)
{
puts("not found");
return 1;
}
for(;rc<ptab->busy;rc++)
ptab->mas[rc]=ptab->mas[rc+1];
ptab->busy=ptab->busy-1;
puts("OK");
return 1;
}
void putTable(Table *ptab)
{
int i;
for(i=0; i<ptab->busy; i++)
printf("Key: %d. Info: %s\n",ptab->mas[i].key, ptab->mas[i].info);
if(!i)
puts("Empty table");
}
int D_Show(Table *ptab)
{
putTable(ptab);
return 1;
}