2016-06-20 3 views
-1

このプログラムは、ファイルを作成し、ファイルに書き込んだ後、そのファイルから読み込んだ後にデータを更新し、ファイルの内容を配列に格納します。コードを実行すると正しく動作しません。実際には、Vet[i].squadra以外のすべての値はゼロです。コードをデバッグしたところ、とfreedを使用するたびにAggiornaFile関数がゼロ変数の値にリセットされることがわかったので、fwriteの値を0でファイルに更新すると思います。なぜこのコードはファイルを更新しないのですか?

#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

'AggiornaFile'を読み込み/変更/書き込みしようとする場合は、書き込みの前に再度' fseek'する必要があります。 –

+0

@WeatherVaneありがとうございます。これは、値がすべてゼロである 'Vet [3]'を除いて機能します。 – Malgiolio

+0

その関数には2つのオカレンスがあります...レコード番号を0ベースに調整していますか? –

答えて

1

freadfwriteは、ファイルポインタを進め両方ことに留意されたいです。

AggiornaFileで読み取り/変更/書き込みしたい場合は、書き込み前にもう一度fseekする必要があります。

また、0ベースのレコードインデックスを使用してください。

関連する問題