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:
La funzione julianDate è la seguentecodice: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); }
Il problema è il seguente: andando a richiamare la funzione, va in loop nel ciclocodice: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 potrebbe potrebbe essere nella funzione julianDate? La utilizzo anche in altri ambiti ma non da problemi (ho notato che rovina il parametro passato).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); }
Grazie in anticipo per l'aiuto![]()

						
					
					
					
						
  Rispondi quotando
						
			