Чтение с файла работает некорректно - 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];

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы