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.