Ciao a tutti, nell'esercitazione scolastica che sto sviluppando (Linguaggio C in teoria, ma ai prof va bene che compiliamo codice misto C/C++) ho la necessità di "rimuovere logicamente" (tramite un campo nella struct) dei campi.
Il codice che ho scritto:
codice:
struct movimento
{
char nome[42];
char prestazione[42];
char data[12];
bool visible;
bool ripetizione; /*se deve essere ripetuta*/
};
int removeAllMovementDate(char date[])
{
int max=julianDate(date); /*giorno giuliano della data inserita*/
getchar();
int now;
int flag =0;
char app[11];
FILE *fp;
struct movimento rec;
fp=fopen("filemovimenti.dat", "r+b");/*Apertura file in modalita lettura e binario*/
if(fp==NULL)
{
printf("\n Errore di apertura file \n");
return(-1);
getchar();
}
PuliziaBuffer();
fread(&rec,sizeof(struct movimento),1,fp);
while(!feof(fp))
{
/*omettendo questa riga il problema non si presenta*/
now=julianDate(app); /*giorno giuliano del movimento attuale*/
if((rec.visible==true)&&(now<max)) /*se il movimento non è nascosto ed è precedente alla data*/
{
rec.visible=false; /*rendo il movimento non visibile */
fseek(fp,-sizeof(struct movimento),SEEK_CUR);/*sposto il puntatore indietro di un record*/
fwrite(&rec,sizeof(struct movimento),1,fp); /*e sovrascrivo*/
}
fread(&rec,sizeof(struct movimento),1,fp);
}
fclose(fp);
printf("\n Sovrascrittura eseguita correttamente."); /*messaggio di avviso*/
return(0);
}
La funzione julianDate è la seguente
codice:
int julianDate(char *data)
{ //restutisce quanti giorni sono passati dal 01/01/4713 a.C.
char *cday,*cmonth,*cyear;
char separatore[]=" / - \ ";
cday=strtok(data,separatore);/*acquisico i numeri come stringhe*/
cmonth=strtok(NULL,separatore);
cyear=strtok(NULL,separatore);
int d =atoi(cday); /*converto in interi*/
int m = atoi(cmonth);
int y1 = atoi(cyear);
int a,y,l;
a=(14-m)/12;
y=y1+4800-a;
l=m+12*a-3;
return (d+(153*l+2)/5+365*y+y/4-y/100+y/400-32045);
}
Il problema è il seguente: andando a richiamare la funzione, va in loop nel ciclo
codice:
while(!feof(fp))
{
/*omettendo questa riga il problema non si presenta*/
now=julianDate(app); /*giorno giuliano del movimento attuale*/
if((rec.visible==true)&&(now<max)) /*se il movimento non è nascosto ed è precedente alla data*/
{
rec.visible=false; /*rendo il movimento non visibile */
fseek(fp,-sizeof(struct movimento),SEEK_CUR);/*sposto il puntatore indietro di un record*/
fwrite(&rec,sizeof(struct movimento),1,fp); /*e sovrascrivo*/
}
fread(&rec,sizeof(struct movimento),1,fp);
}
Il problema potrebbe potrebbe essere nella funzione julianDate? La utilizzo anche in altri ambiti ma non da problemi (ho notato che rovina il parametro passato).
Grazie in anticipo per l'aiuto