Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
La funzione scrivi_file () crea il file "database.dat" e vi immagazzina al suo interno, attraverso fwrite, la struttura Database con il membro "numero" inizializzato a 10.
La funzione leggi_file () apre "database.dat" in modalita' lettura, immagazzina il contenuto nella variabile struttura "var_database" e lo visualizza grazie a printf.
Il problema e' che il programma manda in output due volte il numero 10, come se fwrite avesse imagazzinato nel file due volte l' oggetto "var_database" (quando invece avrebbe dovuto imagazzinarne solo uno).
Questa e' la versione semplificata di quello che mi accade ad un progetto molto piu' corposo a cui sto lavorando, non riesco a capirne il motivo.
Piazza un breakpoint dentro questo ciclo, e controlla il valore restituito da fread (che ti dice il numero esatto di bytes letti).
Considera che il valore di fread dovresti SEMPRE acquisirlo dentro una variabile, e confrontarlo con il valore da te aspettato.
Se restituisce qualcosa di meno vuol dire che è successo qualcosa di brutto.
Se itera 2 volte questo ciclo, significa che alla prima fread non viene raggiunta la fine del file. Questo potrebbe essere dovuto a settordicimila motivi diversi. Ad esempio perchè hai dimenticato di fare fseek(file, 0, SEEK_SET) prima del ciclo di lettura (la posizione dentro il file dovrebbe partire da zero, ma non si sa mai).
un'altra causa potrebbe essere dovuta al fatto che tratti i file come se fossero file ASCII. Usa "rb" e "wb". In questo modo eviterai problemi legati a speciali caratteri di stampa. Ad esempio tu scrivi il numero 10, che corrisponde all'andata a capo, quindi Windows aggiungerà automaticamente anche un secondo byte con il valore 13 che ti va a sballare il contenuto del file.
Questo è dovuto al fatto che Windows converte al volo le letture/scritture di file ASCII, sostituendo il carattere 10 (andata a capo stile Unix) con la coppia 10-13 (andata a capo stile Windows).
Non mi vengono altre idee per il momento, intanto prova queste cose (ma una alla volta, finchè non trovi quella giusta) e vediamo se risolvi...
Il suggerimento di Pitagora non funziona, da esattamento lo stesso output che ho descritto nel primo post.
Per quanto riguarda quello che dice TheKaneB, ho provato a :
- usare il metodo lettura e scrittura binaria, ma non e' cambiato nulla.
- aggiungere un fseek (file, 0, SEEK_SET) prima del ciclo while in modo che fossi sicuro che la ricerca partisse dall' inizio, ma anche qui non e' cambiato nulla.
- usare entrambi, ed ancora niente
- poi infine ho provato con il breakpoint
il breakpoint e' dopo il secondo printf. Il ciclo itera due volte : la prima il valore "size" (restituito da fread) e' uguale ad 1, mentre la seconda volta e' uguale a 0.
Quindi, come dicevi tu, e' proprio un valore minore a quello che mi aspettavo, avrebbe dovuto restituire un valore pari a 4 (bytes) e non 1.
Il problema e' ora capire quel "qualcosa di brutto" che e' successo
se fread restituisce 0, vuol dire che è finito il file. Evidentemente l'implementazione di feof() non è attendibile, perchè il file risulta "terminato" soltanto dopo averlo forzato a leggere oltre l'ultimo byte.
A questo punto io riscriverei il ciclo in modo tale da effettuare prima la fread, e poi il controllo sul size per vedere se è finito il file, e scarterei l'uso di feof() che evidentemente non va bene per questo esercizio.
fread() l'ho messa a fine ciclo in modo tale che questo fallisca (quando size = 0) prima che venga raggiunta la successiva printf() e che venga quindi visualizzato il valore "di troppo".
Grazie per la pazienza ed il tempo che mi hai dedicato