Чтение с файла работает некорректно - C (СИ)
Формулировка задачи:
Возникают проблеммы при считывании с файла елементов после удаления одного из них. Например, вводим 1 запись, записываем ее в файл, удаляем , потом при попытке чтения с файла(Read), не считывается запись с файла, при попытке дебага, обнаружилось, что в масив считываются только первые 2 буквы одного поля, все остальное муссор массива.
П.С. Это мое задание на курсовую(1курс), мучаюсь уже не знаю сколько=(.
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <dos.h>
#include <stdlib.h>
struct inform
{
char name[30];
char age[15];
char type[15];
char card[5];
int ntype;
float clientnumber;
float mustpay;
};
//
int readinform(inform * inf, int count,float *clientdiscount,date *d);
//
int printinform(inform * inf, date *d, int count );
//
void yesdiscount(inform * inf, float *clientdiscount);
//
int chosework();
//
void dowork(int i, inform * inf);
//
int writeinf(inform *inf, int count);
//
int readinf(inform *inf);
//
void prices();
//
int drawMenu(int cur);
//
void search(inform *inf, date *d, int count);
//
void delet(inform *inf, date *d, int count);
//
void tabldraw();
//
void money(inform *inf, int count,date *d, int *sum);
//
int sumall(inform *inf, int count);
//
void summonth(inform *inf,date *d,int count, int mon, int sumarr);
//
void maxmonthsum(int *sum);
//
int choseavto();
//
int readd(date *d);
//
int writed(date *d, int count);
//
void dstring(inform *inf,int count);
char *MenuNames[]={"Pryynyty zamovlenya","Poshuk","Zapusaty y file","Read","Pokazaty prybytok","Delete","Vyxid"};
char *CarName[]={"Jeep","Legcova","Microavtobus"};
const MenuCount = 7;
const Maxsize = 50;
const char *tabl="-------------------------------------------------------------------------------";
int sizeArr = 0;
int main()
{
float clientdiscount[6] = {
5639727, 5673691, 4456787, 5674356, 9876543, 1234567
};
int flag=0;
int count = 0;
int ch, cur = 0;
drawMenu(0);
inform inf[Maxsize];
struct date d[Maxsize];
inform temp[Maxsize];
int sumarr[12];
for(int j=0; j<12; j++)
sumarr[j]=0;
while ((ch = getch()) != 27)
{
if(ch==0)
{
ch=getch();
switch(ch)
{
case 75:
case 80:
cur--;
break;
case 72:
case 77:
cur++;
break;
}
cur=(cur+MenuCount)%MenuCount;
}
else
if(ch==13)
{
switch(cur)
{
case 0:
count = readinform(inf,count,clientdiscount,d);
break;
case 1:
{
search(inf,d,count);
getch();
}
break;
case 2:
{
writed(d,count);
writeinf(inf,count);
}
break;
case 3:
{
readd(d);
//dstring(inf,count);
count=readinf(inf);
if(count<=0)
{
printf("\nFile pyst\n");
getch();
}
}
break;
case 4:
{
money(inf,count,d,sumarr);
flag++;
if(flag>=2)
maxmonthsum(sumarr);
getch();
}
break;
case 5:
{
delet(inf,d,count);
count--;
}
break;
case 6:
{
return 0;
}
}
}
drawMenu(cur);
}
return 0;
}
/*void dstring(inform *inf,int count)
{
char *s="0";
for(int i=0; i <= count; i++)
{
strcpy((inf+i)->name,s);
strcpy((inf+i)->age,s);
strcpy((inf+i)->type,s);
strcpy((inf+i)->card,s);
inf[i].ntype=0;
inf[i].mustpay=0;
inf[i].clientnumber=0;
}
}*/
void maxmonthsum(int *sumarr)
{
int max=sumarr[0], k=0;
for(int i=1; i<12; i++)
if(sumarr[i]>max)
{
max=sumarr[i];
k=i;
}
textcolor(2);
cprintf("Max prybytok narahovano za %d misyats\n\r",k);
textcolor(15);
}
int sumall(inform *inf, int count)
{
int sum=0;
for(int i=0; i<count; i++)
sum+=inf[i].mustpay;
textcolor(2);
cprintf("Zagalna summa doxody za inform. na cey moment stanovyt %d hrn\n\r",sum);
textcolor(15);
return 0;
}
void summonth(inform *inf,date *d,int count, int mon, int *sumarr)
{
int s=0;
for(int i=0; i<count; i++)
if(mon==d[i].da_mon)
s+=inf[i].mustpay;
textcolor(2);
cprintf("Summa doxody za misats stanovyt %d hrn\n\r",s);
textcolor(15);
sumarr[mon]=s;
}
void money(inform *inf, int count, date *d, int *sumarr)
{
int mon,year,flag=0;
printf("\nVvedit misyats ta rik dly pokazy prybytky\n");
scanf("%d%d",&mon,&year);
tabldraw();
for(int i=0; i<count; i++)
{
if(mon == d[i].da_mon && year == d[i].da_year)
{
printinform(inf,d,i);
flag=1;
}
}
if(!flag)
{
printf("Nichogo ne znaydeno\n");
sumarr[mon]=0;
}
if(flag)
{
summonth(inf,d,count,mon,sumarr);
sumall(inf,count);
}
}
void delet(inform *inf, date *d, int count)
{
int num=0;
printf("\nVvedit nomer zapysy dly vydalenya\n");
scanf("%d",&num);
for(int i=num; i < count; i++)
{
inf[i]=inf[i+1];
d[i]=d[i+1];
}
}
void search(inform *inf, date *d, int count)
{
int flag=0;
char name[30];
printf("\nVvedit prizvushe klienta\n");
scanf("%s",name);
for(int i=0; i<count; i++ )
{
if(strstr((inf+i)->name,name))
{
printinform(inf,d,i);
flag=1;
}
}
if(flag==0)
printf("Takogo klienta ne maye v bazi\n");
}
void dowork(int i, inform *inf)
{
if (i == 0) {
switch(inf->ntype) {
case 1:
inf->mustpay += 70;
break;
case 2:
inf->mustpay += 50;
break;
case 3:
inf->mustpay += 90;
break;
}
}
if (i == 1) {
switch(inf->ntype) {
case 1:
inf->mustpay += 120;
break;
case 2:
inf->mustpay += 100;
break;
case 3:
inf->mustpay += 140;
break;
}
}
if (i == 2) {
switch(inf->ntype) {
case 1:
inf->mustpay += 30;
break;
case 2:
inf->mustpay += 25;
break;
case 3:
inf->mustpay += 35;
break;
}
}
return;
}
void prices()
{
printf("%s\n",tabl);
printf("| Typ avto | Standartna myyka | Myyka+ | Pryb. salona |\n");
printf("%s\n",tabl);
printf("| Jeep | 70 hrn | 120 hrn | 30 hrn |\n");
printf("| Legcova | 50 hrn | 100 hrn | 25 hrn |\n");
printf("| Microavtobus| 90 hrn | 140 hrn | 35 hrn |\n");
printf("%s\n",tabl);
}
int chosework()
{
int ch;
char a[3]={'*',' ',' '};
int i = 0;
clrscr();
prices();
printf("Vuberit vyd robit(za dopomigoyu strilkok vverx ta vnyz\n");
printf("%c", a[0]);
printf("Standartna myyka\n");
printf("%c", a[1]);
printf("Myyka+\n");
printf("%c", a[2]);
printf("Salon\n");
while ((ch = getch()) != 27)
{
if(ch==0)
{
ch=getch();
switch(ch)
{
case 72:
i--;
break;
case 80:
i++;
break;
}
i=(i+3)%3;
for(int j=0; j<3; j++)
a[j]=0;
a[i]='*';
}
else
if(ch==13)
return i;
clrscr();
prices();
printf("Vuberit vyd robit(za dopomigoyu strilkok vverx ta vnyz\n");
printf("%c", a[0]);
printf("Standartna myyka\n");
printf("%c", a[1]);
printf("Myyka+\n");
printf("%c", a[2]);
printf("Salon\n");
}
return i;
}
int choseavto()
{
int ch;
char a[3]={'*',' ',' '};
int i = 0;
clrscr();
printf("Vuberit vyd avto(za dopomigoyu strilkok vverx ta vnyz\n%cJeep\n%cLegcova\n%cMicrobus\n",a[0],a[1],a[2]);
while ((ch = getch()) != 27)
{
if(ch==0)
{
ch=getch();
switch(ch)
{
case 72:
i--;
break;
case 80:
i++;
break;
}
i=(i+3)%3;
for(int j=0; j<3; j++)
a[j]=0;
a[i]='*';
}
else
if(ch==13)
return i+1;
clrscr();
printf("Vuberit vyd avto(za dopomigoyu strilkok vverx ta vnyz\n%cJeep\n%cLegcova\n%cMicrobus\n",a[0],a[1],a[2]);
}
return i+1;
}
void tabldraw()
{
printf("\n%s\n",tabl);
printf("| # | PIB | Nomer | Data | Nomer kartky | Typ avto | Suma |\n");
printf("%s\n",tabl);
}
int printinform(inform *inf, date *d, int i )
{
printf("|%-3d|%-16s|%-10s|%-d.%-d.%-d|%-14.0f|%-10s|%-6.1f|\n",i,inf[i].name, inf[i].age,
d[i].da_day, d[i].da_mon, d[i].da_year, inf[i].clientnumber, inf[i].type, inf[i].mustpay);
printf("%s\n",tabl);
return 0;
}
int readinform(inform *inf, int count,float *clientdiscount,date *d )
{
for(int j=0; j<count; j++)
{
inf++;
d++;
}
for (char readanswer[5]; *readanswer != 'n'; )
{
getchar();
printf("\nVvedit' PIB klijenta\n");
gets(inf->name);
printf("Vvedit Nomer telephona\n");
scanf("%s",inf->age);
inf->ntype=choseavto();
if (inf->ntype == 1)
strcpy(inf->type,*CarName);
if (inf->ntype == 2)
strcpy(inf->type,*(CarName+1));
if (inf->ntype == 3)
strcpy(inf->type,*(CarName+2));
inf->mustpay = 0;
for (*readanswer = 'y'; *readanswer != 'n'; )
{
int i = chosework();
dowork(i,inf);
printf("Obraty she poslygy y/n&\n");
scanf("%s", &readanswer);
if (*readanswer == 'y')
continue;
}
getchar();
printf("Vvedit' informaciju pro najavnist' znyzhky y/n?\n");
gets(inf->card);
if (*inf->card == 'y')
{
yesdiscount(inf, clientdiscount);
}else
inf->clientnumber=0;
getdate(d);
d++;
count++;
}
return count;
}
void yesdiscount(inform *inf, float *clientdiscount) {
printf("Vvedit nomer dyskontnoi kartky\n");
float temp;
scanf("%f", &temp);
inf->clientnumber = temp;
int flag = 0;
for (int i = 0; i < 6; i++) {
if (inf->clientnumber == clientdiscount[i]) {
printf("Vam dadano znyshky 10%\n");
getch();
inf->mustpay -= inf->mustpay / 10;
flag++;
}
}
if (flag == 0) {
printf("Takogo nomery ne isnuye sprobyvaty she y/n&\n");
getch();
char more[5];
scanf("%s", more);
if (*more == 'y')
yesdiscount(inf, clientdiscount);
else
inf->clientnumber=0;
}
}
int drawMenu(int cur) {
textbackground(BLACK);
clrscr();
for (int i = 0; i < MenuCount; i++) {
if (cur == i) {
textcolor(2);
textbackground(BLUE);
}
else {
textcolor(MAGENTA);
textbackground(BLACK);
}
cprintf(" ");
cprintf(MenuNames[i]);
}
textbackground(BLACK);
textcolor(WHITE);
return 0;
}
int writeinf(inform *inf, int count)
{
FILE *winf=fopen("wash_inf.dat","wb");
if(!winf)
{
printf("File open error!\n");
getch();
return -2;
}
fwrite(inf,sizeof(inf),count,winf);
fclose(winf);
return 0;
}
int writed(date *d, int count)
{
FILE *wd=fopen("wash_d.dat","wb");
if(!wd)
{
printf("File open error!\n");
getch();
return -2;
}
fwrite(d,sizeof(d),count,wd);
fclose(wd);
return 0;
}
int readd(date *d)
{
FILE *wd=fopen("wash_d.dat","rb");
if(!wd)
{
printf("File open error!\n");
getch();
return -2;
}
fread(d,sizeof(d),500,wd);
fclose(wd);
return 0;
}
int readinf(inform *inf)
{
int r;
FILE *winf=fopen("wash_inf.dat","rb");
if(!winf)
{
printf("File open error!\n");
getch();
return -2;
}
r=fread(inf,sizeof(inf),500,winf);
fclose(winf);
return r;
}Решение задачи: «Чтение с файла работает некорректно»
textual
Листинг программы
struct date d[Maxsize];