2016-06-20 1 views
-1

ce programme créer un fichier, écrire sur le fichier, après lecture de ce fichier, mettre à jour les données et ensuite mettre le contenu du fichier dans un tableau. Quand je cours le code, il ne fonctionne pas correctement, en fait, toutes les valeurs imprimées excepté Vet[i].squadra sont nulles. J'ai débogué le code et j'ai vu que la fonction AggiornaFile remet à zéro les valeurs de la variable chaque fois que j'utilise fseek et freed, donc je pense que fwrite met à jour les valeurs dans le fichier avec des zéros.Pourquoi ce code ne met pas à jour le fichier?

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

typedef char Stringa[DIMCAR]; 

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); 
int CalcolaEsito(Match); 
void DisputaFase(int, Stringa); 
Nota CalcolaClassifica(Nota[], int, Stringa); 
void ordina(Nota *, int); 
void StampaClassifica(Nota[], int); 
int calcolaNPartite(Nota); 

void CreaFile(Stringa percorso, int valDati){ 

    FILE *ptr; 
    Nota n; 
    int i; 

    ptr = fopen(percorso, "wb"); 

    if(ptr ==NULL){ 

     printf("File inesistente.\n"); 
    } 
    else{ 

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

     n.partite.vinte = 0; 
     n.partite.perse = 0; 
     n.partite.nulle = 0; 
     n.goal.subiti = 0; 
     n.goal.effettuati = 0; 
     n.punti = 0; 
     n.squadra = i; 
     fwrite(&n, sizeof(Nota), 1, ptr); 

     } 
     fclose(ptr); 
    } 

} 

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

    int rand1,rand2; 

    incontro->squadra1 = S1; 
    incontro->squadra2 = S2; 

    rand1 = rand() % 5; 
    rand2 = rand() % 5; 

    incontro->goal1 = rand1; 
    incontro->goal2 = rand2; 
} 

void AggiornaFile(Stringa percorso, Match incontro){ 

    FILE *ptr; 
    Nota n; 
    int esito; 

    ptr = fopen(percorso, "rb+"); 

    if(ptr == NULL){ 

     printf("File inesistente.\n"); 
    } 
    else{ 

     fseek(ptr, incontro.squadra1*sizeof(Nota), SEEK_SET); 
     fread(&n, sizeof(Nota), 1, ptr); 

     n.goal.effettuati += incontro.goal1; 
     n.goal.subiti += incontro.goal2; 
     esito = CalcolaEsito(incontro); 

     switch(esito){ 

      case 0: 
       n.partite.nulle++; 
       n.punti += 1; 
       break; 

      case 1: 
       n.partite.vinte++; 
       n.punti += 3; 
       break; 

      case 2: 
       n.partite.perse++; 
       break; 
     } 
     fwrite(&n, sizeof(Nota),1, ptr); 

     fseek(ptr, incontro.squadra2*sizeof(Nota), SEEK_SET); 
     fread(&n, sizeof(Nota), 1, ptr); 
     n.goal.effettuati += incontro.goal2; 
     n.goal.subiti += incontro.goal1; 

     switch(esito){ 

      case 0: 
       n.partite.nulle++; 
       n.punti += 1; 
       break; 

      case 1: 
       n.partite.perse++; 
       break; 

      case 2: 
       n.partite.vinte++; 
       n.punti += 3; 
       break; 
     } 
     fwrite(&n, sizeof(Nota),1, ptr); 
     fclose(ptr); 
    } 
} 

int CalcolaEsito(Match incontro){ 

    int esito; 

    if(incontro.goal1 == incontro.goal2){ 

     esito = 0; 
    } 
    else if(incontro.goal1 > incontro.goal2){ 

     esito = 1; 
    } 
    else{ 

     esito = 2; 
    } 
    return esito; 
} 

void DisputaFase(int valDati, Stringa percorso){ 


    Match incontro; 
    int i,j; 



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

      for(j=1; j<=valDati; j++){ 

       if(j!= i){ 

        DisputaMatch(&incontro, i, j); 
        AggiornaFile(percorso, incontro); 
       } 
      } 
     } 
} 

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

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

    ptr = fopen(percorso, "rb"); 

    if(ptr == NULL){ 

     printf("File inesistente.\n"); 
    } 
    else{ 

     while(!feof(ptr)){ 
      fread(&n, sizeof(Nota),1,ptr); 
      Vet[i] = n; 

      i++; 

     } 
    fclose(ptr);  

    } 

    ordina(Vet, dim); 
    return Vet[0]; 
} 

void ordina(Nota *Vet, int dim){ 

    int i,j; 
    int min; 
    Nota temp; 

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

     min = i; 

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

      if(Vet[min].punti < Vet[j].punti){ 

       min = j; 
      } 
     } 
     if(min != i){ 

      temp = Vet[min]; 
      Vet[min] = Vet[i]; 
      Vet[i] =temp; 

     } 
    } 
} 

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

    int i,j; 


    printf("\n%s%15s%15s%18s%15s%15s%15s%15s\n", "Squadra", "Punteggio", " PartiteGiocate", "Vinte", "Perse", "Nulle", "Gsubiti", "Gfatti"); 

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

     printf("%7d%15d%15d%18d%15d%15d%15d%15d\n", 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 calcolaNPartite(Nota nota){ 

    int giocate; 

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

    return giocate; 

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

    FILE *ptr; 
    char percorso[300] = "C:\\file.dat"; 
    Nota Vet[DIMMAX]; 
    srand(time(NULL)); 

    CreaFile(percorso, DIMMAX); 
    DisputaFase(DIMMAX, percorso); 
    CalcolaClassifica(Vet, DIMMAX, percorso); 
    StampaClassifica(Vet, DIMMAX); 


    return 0; 
} 
+1

Si vous essayez de lire/modifier/écrire dans 'AggiornaFile' vous devez' fseek' avant l'écriture. –

+0

@WeatherVane Merci. Maintenant ça marche sauf 'Vet [3]' dont les valeurs sont toutes nulles. – Malgiolio

+0

Il y a deux occurrences dans cette fonction ... et ajustez-vous les numéros d'enregistrement pour qu'ils soient basés sur 0? –

Répondre

1

Notez que fread et fwrite à la fois avant le pointeur de fichier.

Lorsque vous voulez lire/modifier/écrire AggiornaFile vous devez encore fseek avant l'écriture.

De même, veillez à utiliser l'indexation d'enregistrements basée sur 0.