Funzione fseek()

di il
1 risposte

Funzione fseek()

Ciao a tutti,
sto implementando un programmino che aggiorna una lista di stipendi di alcuni dipendenti in c.

il programma crea una lista d'impiegati su un file (impiegati.dat) (in modalita binaria)
poi da la possibilita di leggere dal file impiegati.dat da console
e infine attraverso un file aggiornaStipendi.txt dove vengono inseriti i nominativi dei dipendenti piu il loro stipendio aggiornato, viene aggiornato il file impiegati.dat

funziona tutto tranne l'ultima parte... cioe nel punto finale del programma quando uso fseek()
il programma ha un unica struttura:
typedef struct impiegato { 
	char nome[15];
	char cognome[15];
	char indirizzo[40];
	int stipendio;
} Impiegato;
vi mostro la parte finale dove il codice non gira come deve

		while (fread(&impiegatoOldCorrente, sizeof(Impiegato), 1, fileListaImp) != 0) {

			for (int i=0; i<numImpiegati; i++) {
				if (strcmp(impiegatoOldCorrente.cognome, listaImpAggiornata[i].cognome) == 0) {
					fseek(fileListaImp, -sizeof(Impiegato), SEEK_CUR);
					impiegatoOldCorrente.stipendio = listaImpAggiornata[i].stipendio;
					fwrite(&impiegatoOldCorrente, sizeof(Impiegato), 1, fileListaImp);
				}
			}
		}
allora fileListaImp e' il puntatore a Impiegati.dat cioe la lista d'impiegati (fopen l'ho fatto in modalita rb+)

ogni impiegato viene messo su una variabile di tipo Impiegato chiamata impiegatoOldCorrente
e fin qua tutto funziona

poi all interno del secondo loop avviene l'iterazione fino a quando non finisce la lettura dei nuovi impiegati presi dal file aggiornaStipendi che son gia stati messi in un array di tipo Impiegato. In pratica ciclo tutti gli impiegati nuovi (aggiornati) e vedo se ce una corrispondenza con il cognome sull impiegato vecchio attuale.

se i cognomi sono uguali
e adesso è qua che non va come dovrebbe
mi posiziono un tassello prima cioe all inizio della lettura del primo dato con il puntatore fileListaImp poi assegno il nuovo stipendo all impiegato e subito dopo lo reinserisco al suo posto nella lista Impiegati .dat

ho fatto questo test con solo 3 impiegati in impiegati.dat e 2 impiegati nel file aggiornastipendi.txt

dove i cognomi sono uguali fra i primi 2 impiegati dei 2 file e i secondi 2 sempre dei medesimi file.
ma tutto quello che ho scritto sino ad ora e' irrilevante perche funziona come voglio, il problema arriva adesso[/color]

al primo giro tutto funziona e mi aggiorna lo stipendio e me lo salva correttamente (perche i cognomi combaciano)

quando inizia il secondo giro del loop esterno iniziano cose strane:
praticamente giustamente mi mette nella variabile temporanea il nuovo impiegato da confrontare con quelli aggiornati...
appena trova il cognome
si posiziona un tassello indietro ma questa volta non so perche il puntatore del file si riporta all'inizio.... e da qui in poi baaaaaaaaaam ciclo infinito...

come puo essere possibile?

il primo giro va... e aggiorna
quando si tratta pero (al secondo giro) dove ce la seconda corrispondenza, di andare un tassello sopra per scrivere sul secondo impiegato, non so perche va a finirmi sul primo... cioe all inizio del file....

grazie

1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte