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