samedi 18 juin 2016

Why this code prints strange numbers?

I'm learning C and I have some problems with files. I'm not sure that I'm using fread,fwrite and fseek right. I have to create file in CreaFile function and I have to set p.squadra ,for each element that I insert, with the i-th value. After, with AggiornaFile I have to update data into file. With calcolaClassifica I have to put element of file in a array. The other function work on this array. When i run the program, for every input, it prints stange numbers that seem memory addresses. Can someone tell me where I make a mistake?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define DIMMAX 4


/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef char Stringa[DIMMAX];

typedef struct{

    int vinte;
    int perse;
    int nulle;

} Partite;

typedef struct{

    int subiti;
    int effettuati;

} Goal;

typedef struct{

    int squadra;
    Partite partite;
    Goal goal;
    int punti;

} Nota;

typedef struct{

    int squadra1;
    int squadra2;
    int goal1;
    int goal2;

} Match;

void CreaFile(Stringa, int);
void DisputaMatch(Match, int, int);
void AggiornaFile(Stringa, Match);
void DisputaFase(int, Stringa);
Nota CalcolaClassifica(Nota[],int, Stringa);
void StampaClassifica(Nota[], int);
int calcolaNPartite(Nota);

void CreaFile(Stringa percorso, int valDati){

    FILE *ptr;
    int i;
    Nota p;

    valDati = DIMMAX;

    ptr = fopen(percorso, "wb");
    if(ptr == NULL){

        printf("File non esistente.n");
    }
    else{

        for(i=0; i<valDati; i++){

              p.squadra = i;
              fwrite(&p, sizeof(Nota), 1, ptr); 


        }
        fclose(ptr);
    }
}

void DisputaMatch(Match incontro, int S1, int S2){

    int i, j;

    incontro.squadra1 = S1;
    incontro.squadra2 = S2;

     i = rand() % 5;
     j = rand() % 5;

    incontro.goal1 = i;
    incontro.goal2 = j;

}

int calcolaEsito(Match incontro){

    int i;

    if(incontro.goal1>incontro.goal2){
        i = 1;
    } else if(incontro.goal1 < incontro.goal2){
    i = 2;
    } else i = 0;

    return i;
    }

void AggiornaFile(Stringa percorso, Match incontro){

    FILE  *ptr;
    Nota p;
    int i = 0;

    ptr = fopen(percorso, "rb");

    if(ptr == NULL){

        printf("File non esistente.n");
    }
    else{

       while(!EOF){
        fseek( ptr, i*sizeof(Nota),SEEK_SET);
        fread(&p,sizeof(Nota),1,ptr);
        if(p.squadra==incontro.squadra1){
            p.goal.effettuati += incontro.goal1;
            switch(calcolaEsito(incontro)){
                case 0:
                    p.partite.nulle++;
                    break;
                case 1:
                    p.partite.vinte++;
                    break;
                case 2:
                    p.partite.perse++;
                    break;

            }

        }
        if(p.squadra==incontro.squadra2){
            p.goal.effettuati += incontro.goal2;
            switch(calcolaEsito(incontro)){
                case 0:
                    p.partite.nulle++;
                    break;
                case 1:
                    p.partite.perse++;
                    break;
                case 2:
                    p.partite.vinte++;
                    break;

            }   
        }

        i++;

       }

        fclose(ptr);

    }

}

void DisputaFase(int n, Stringa percorso){

    FILE  *ptr;
    Nota p;
    int i = 0;
    Match incontro;

    ptr = fopen(percorso, "rb");

    if(ptr == NULL){

        printf("File non esistente.n");
    }
    else{

        int i,j;
        int m = 0;
        Nota n1,n2;

        i = rand() % 5;
        j = rand() % 5;


        while(m!=n)

        if(i!=j){


             fseek( ptr, i*sizeof(Nota),SEEK_SET);
             fread(&n1,sizeof(Nota),1,ptr);

             fseek( ptr, j*sizeof(Nota),SEEK_SET);
             fread(&n2,sizeof(Nota),1,ptr);

             DisputaMatch(incontro, n1.squadra, n2.squadra);
             AggiornaFile(percorso,incontro);


        m++;
        }


        fclose(ptr);

    }

}


Nota CalcolaClassifica(Nota Vet[],int dim , Stringa percorso){

    FILE  *ptr;
    int i = 0;
    int j,k,min;
    Nota temp;

    ptr = fopen(percorso, "rb");

    if(ptr == NULL){

        printf("File non esistente.n");
    }
    else{


            fseek( ptr, dim*sizeof(Nota),SEEK_SET);
            fread(Vet,sizeof(Nota),dim,ptr);

            for(j=0; j< dim-1; j++){

                min = j;

                for(k= j+1; k<dim; k++){
                    if(Vet[j].punti < Vet[k].punti){

                        min = k;
                    }
                }

                if(min != j){

                    temp = Vet[j];
                    Vet[j] = Vet[min];
                    Vet[min]= temp;
                }
            } 

    fclose(ptr);

    }

    return Vet[0];


}

int calcolaNPartite(Nota nota){

    int giocate;

    giocate = nota.partite.nulle+ nota.partite.perse + nota.partite.vinte;

    return giocate;

}


void StampaClassifica(Nota Vet[], int dim){

    int i;


    printf("%s%10s%16s%10s%6s%6s%6s%8s%8sn","Squadra","Punteggio","PartiteGiocate","Vinte",
    "Perse","Nulle", "GSubiti", "GFatti");

    for(i = 0; i < dim; i++){

    printf("%d%10d%16d%10d%6d%6d%6d%8d%8dn", Vet[i].squadra, Vet[i].punti, calcolaNPartite(Vet[i]),
    Vet[i].partite.vinte,   Vet[i].partite.perse,   Vet[i].partite.nulle, Vet[i].goal.subiti,
    Vet[i].goal.effettuati);    

    }



}


int calcolaMin(Nota vett[],int dim){

    int i = 0;
    int min = vett[i].goal.effettuati;

    for(i = 1; i < dim; i++){

        if(vett[i].goal.effettuati > min){

            min = vett[i].goal.effettuati;
        }

    }

    return i;
}

int calcolaMax(Nota vett[],int dim){

    int i;
    int max = 0;

    for(i = 0; i < dim; i++){

        if(vett[i].goal.subiti > max){

            max = vett[i].goal.subiti;
        }

    }
    return i;
}

Main is:

int main(int argc, char *argv[]) {

    FILE *ptr;

    int S1;
    int S2;
    Match incontro;
    srand(time(NULL));
    char percorso[300]= "C:\my_file.dat";
    int n;
    Nota vet[DIMMAX];

    CreaFile(percorso, DIMMAX);
    printf("Creazione matchn");
    printf("Inserire il numero di squadra1: ");
    scanf("%d", &S1);
    printf("Inserire il numero di squadra2: ");
    scanf("%d", &S2);
    DisputaMatch(incontro, S1, S2);
    AggiornaFile(percorso, incontro);
    printf("Assegna un valore ad n");
    scanf("%d",&n);
    CalcolaClassifica(vet, DIMMAX, percorso);
    StampaClassifica(vet, DIMMAX);

    return 0;
}

Aucun commentaire:

Enregistrer un commentaire