2016-06-20 27 views
-1

Dieses Programm erstellen Sie eine Datei, schreiben Sie auf die Datei, nach dem Lesen aus dieser Datei, aktualisieren Sie Daten und dann den Inhalt der Datei in ein Array. Wenn ich den Code ausführen, funktioniert es nicht richtig, in der Tat sind alle Werte außer Vet[i].squadra gedruckt Null. Ich debuggte den Code und ich sah, dass AggiornaFile Funktion setzt auf Null Variablen Werte jedes Mal, wenn ich fseek und freed verwenden, so denke ich, dass fwrite Werte in Datei mit Nullen aktualisieren.Warum aktualisiert dieser Code die Datei nicht?

#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

Wenn Sie versuchen, in 'AggiornaFile' zu ​​lesen/ändern/schreiben, müssen Sie vor dem Schreiben erneut' fseek'. –

+0

@ WeatherVane Danke. Jetzt funktioniert es, außer für 'Vet [3]' welche Werte sind alle Null. – Malgiolio

+0

Es gibt zwei Vorkommen in dieser Funktion ... und passen Sie die Datensatznummern an, die auf 0 basieren? –

Antwort

1

Beachten Sie, dass fread und fwrite beide Voraus der Dateizeiger.

Wenn Sie in AggiornaFile lesen/ändern/schreiben möchten, müssen Sie erneut fseek vor dem Schreiben.

Stellen Sie sicher, dass Sie 0-basierte Indexierung verwenden.