为什么这段代码不更新文件?

Why this code doesn't update file?

此程序创建一个文件,写入该文件,从该文件读取后,更新数据,然后将文件的内容放入一个数组中。当我 运行 代码时,它无法正常工作,事实上,除了 Vet[i].squadra 之外,所有打印的值都是零。我调试了代码,发现每次使用 fseekfreedAggiornaFile 函数都会重置为零变量的值,所以我认为 fwrite 将值更新为零的文件.

#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;
}

注意 freadfwrite 都将文件指针前移。

如果要在 AggiornaFile 中 read/modify/write,您必须在写入前再次 fseek

此外,请务必使用基于 0 的记录索引。