Здравствуйте, помогите, пожалуйста, реализовать следующую задачу:
Шифровать (дешифровать) файл методом смещения кода. Файл содержит сведения о городах России (количество жителей, название, региональная принадлежность). Реализовать добавление и удаление сведений, а так же поиск по названию города.
Код без шифрования, при компиляции ошибок нет, правильно работает только функция Create(), что не так с остальными?
Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int num;
char name[20];
char region[20];
char zit[20];
}data;
void add(char *);
void del(char *);
void view(char *, int );
void find(char *);
int find_max_num(char *);
int get_number(char *);
void create();
int check(char *, data);
void add(char *fn)
{
FILE*fp;
data st;
int pr;
while(1)
{
st.num=find_max_num(fn)+1;
clrscr();
printf("Name: "); scanf("%s",&st.name);
printf("Region: "); scanf("%d",&st.region);
printf("Ziteli: "); scanf("%d",&st.zit);
if(!check(fn,st))
{
if((fp=fopen(fn,"ab+"))==NULL)
{
printf("File could not be opened.\n");
return;
}
fwrite(&st,sizeof(data),1,fp);
fclose(fp);
return;
}
else
{
printf("Zapis' est'");
getch();
}
}
}
void del(char*fn)
{int num;
FILE*fp,*temp;
data st;
int pr=1;
int number;
view(fn,num);
printf("nomer zapisi: ");
int key=0;
scanf("%d",&number);
while(kbhit())
{
if(!(key=='\r'))
{
if((fp=fopen(fn,"ab+"))==NULL)
{
printf("Error.\n");
return;
}
if((temp=fopen("temp.$$$","wb"))==NULL)
{
printf("Error\n");
return;
}
while(fread(&st,sizeof(data),1,fp))
{
if(feof(fp)) break;
if(st.num!=number) fwrite(&st,sizeof(data),1,temp);
else pr=0;
}
fclose(fp);
fclose(temp);
if(remove(fn)==-1)
{
perror("remove");
return;
}
if(rename("temp.$$$",fn)==-1)
{
perror("rename");
return;
}
if(pr)
{
printf("Net fila");
getch();
}
}
clrscr();
}
}
void view(char*fn,int n)
{
FILE*fp;
data st;
int counter=0;
if ((fp = fopen(fn,"rb")) == NULL)
{
printf("File could not be opened.\n");
return;
}
fseek(fp,(n-1)*sizeof(data),SEEK_SET);
while (counter != 18)
{
fread(&st,sizeof(data),1,fp);
if (feof(fp)) break;
else
{
printf("%d %s %d %d",st.num, st.name,st.region,st.zit);
counter++;
}
}
return;
}
void find(char*fn)
{
FILE*fp;
data st;
char string[15];
int pr,prs;
if((fp=fopen(fn,"rb"))==NULL)
{
puts("File couldn't be open");
return;
}
prs=1;
pr=0;
printf("Name: ");
fflush(stdin);
scanf("%s",&string);
rewind(fp);
while(fread(&st,sizeof(data),1,fp))
{
if(feof(fp)) break;
if(!strcmp(st.name,string))
{
if(prs)
{
prs=0;
}
printf(" %d %s %d %d \n",st.num,st.name,st.region,st.zit);
pr=1;
}
if(!pr) printf("\nNET DANNYH");
getch();
}
}
int find_max_num(char *fn)
{
FILE*fp;
data st;
int max;
if ((fp = fopen(fn,"rb")) == NULL)
{
printf("File could not be opened.\n");
return -1;
}
max=0;
while (fread(&st,sizeof(data),1,fp))
{
if (feof(fp)) break;
if (st.num>max) max=st.num;
}
fclose(fp);
return max;
}
void create()
{
FILE*fp;
char*fn;
printf("Name file: ");
fflush(stdin);
scanf("%s",fn);
strcat(fn,".txt");
if ((fp=fopen(fn,"w+b")) == NULL)
{
printf("Error\n");
getch();
}
fclose(fp);
}
int check(char *fn, data st)
{
FILE*fp;
data temp;
int pr=0;
if ((fp = fopen(fn,"rb")) == NULL)
{
printf("File could not be opened.\n");
return 0;
}
while ( fread( &temp, sizeof( data ), 1, fp))
{
if (feof(fp)) break;
if(!strcmp(st.name,temp.name) && !strcmp(st.region,temp.region) && !strcmp(st.zit,temp.zit))
{
pr=1;
break;
}
} fclose(fp);
return pr;
}
void main()
{
char *fn;
int m,num;
do
{
printf("1-Add, 2-Del, 3-Find, 4-Create, 5-View, 6-Exit: "); scanf("%d",&m);
if(m==1){ add(fn); }
if(m==2){ del(fn); }
if(m==3){ find(fn); }
if(m==4) { create();}
if(m==5) { view(fn,num); }
if(m==6) { getch(); }
}while(m<7);
return;
}