TI ringrazio molto per il suggerimento, ma purtroppo dovevo seguire le indicazioni del prof, che sulle slide ha esplicitamente indicato un algoritmo come il mio .Originariamente inviato da Automatik
Il problema l' ho avuto pure io usando DevC. Quando apri un file in "r+b" in teoria sui libri si studia che si può sia leggere e scrivere su file. Bhe con devC non funziona così. Se una volta aperto il file cominci con un fwrite potrai solo usare fwrite e viceversa con fread. io ho risolto usando un file d' appoggio, copiandogli quello che c' era nell' altro file, lavorare sul file d' appoggio poi alla fine rimuovere il file vecchio e rinominare il file d' appoggio con il nome del file vecchio.
Questa è una funzione in cui ho usato questo metodo. remove e rename sono funzioni del sistema operativo quindi non è detto che funzioni su tutti i sistemi. io a scuola e a casa ho windows e probabilmente ce l' hai anche tu. te lo dico caso mai ci fosse quella rara eventualità![]()
codice:void modifica_tutti(stringa nome){ FILE *temp,*f; stringa city; int box,pos; f=fopen(nome,"rb"); temp=fopen("temp.txt","wb"); if(f!=NULL){ while(fread(city,sizeof(stringa),1,f)!=0){ fread(&box,sizeof(int),1,f); pos+=(pos*10)/100; fwrite(city,sizeof(stringa),1,temp); fwrite(&pos,sizeof(int),1,temp); } fclose(f); fclose(temp); remove(nome); rename("temp.txt",nome); } }
Spero di esserti stato d' aiuto
Anche io personalmente avrei usato un file temporaneo, soluzione meno contorta e molto piu facilmente applicabile, ma tant'è ...
Grazie cmq
Eh l'ho scoperto stanotte leggendo una mail del profOriginariamente inviato da oregon
In realtà basta leggere la documentazione per capire come funzionano i file aperti in r+ ...
La documentazione della funzione fseek riporta
"On streams open for update (read+write), a call to fseek allows to switch between reading and writing."
Quindi, quando devi passare da una fwrite ad una fread e viceversa, inserisci una fseek (anche se questa non sposta il puntatore).
Il punto sai qual è ?
Che questa cosa la si può leggere nella documentazione dell'fseek, ma effettivamente, partendo da un approccio sequenziale e considerando fseek una istruzione tipicamente utilizzata dall'accesso diretto, diventa difficile capire dove si trova l'errore senza qualcuno che te lo spieghi![]()
Associa anche il fatto che questa cosa non è esposta in maniera chiara e limpida quando vengono introdotte le varie modalità di apertura, cosa che invece si dovrebbe evidenziare immediatamente ..
![]()
Senti adesso la domanda sorge spontanea..
Se apro in r+b ..
Leggo ...
Fseek ...
Scrivo ...
Poi posso passare nuovamente in modalità lettura con un altro fseek o devo necessariamente chiudere e riaprire il file?![]()
Grazie mille per l'aiuto![]()



Rispondi quotando