Чтение с файла работает некорректно - 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];
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д