Quando si utilizzano file binari in lettura/scrittura, è necessaria una fseek prima di un cambio di "verso". Ovvero, se stai leggendo e vuoi scrivere, devi fare prima una seek e così anche se hai scritto e vuoi tornare a leggere. Ecco perché è necessaria la fseek tra la fwrite e la fread anche se sembra non fare nulla.

Nulla di misterioso (il C non è misterioso), se leggi la documentazione delle funzioni prima di usarle ... Ad esempio, in

http://www.cplusplus.com/reference/cstdio/fseek/

trovi questa cosa se leggi

On streams open for update (read+write), a call to fseek allows to switch between reading and writing.