La faccenda è questa:

codice:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
fread non conosce il formato del buffer che gli passi. Lui vede quel buffer solamente come un insieme di size bytes.

La funzione legge tot byte dal file e copia byte-byte il buffer letto nel buffer che gli passi.

Se tu passi una struttura de genere:

codice:
struct anag {
    char* nome;
    char cognome[10],
};
anche se poi allochi nome quel char* nome è sempre una variabile long (ovvero mantiene in se un indirizzo di memoria di 4 byte) e quella struttura è quindi di 14 byte.

Se tu scrivi sul file questa stringa "Dante Alighieri", quando l'andrai a leggere con fread in quella struttura, la funzione scriverà byte per byte, quindi avrai una struttura danneggiata che conterrà al posto di char* nome char nome[4], metterà "e " nei primi due posti di cognome e poi troncherà "Alighieri".

quando vuoi leggere 20 byte da un file binario, devi passargli precisamente una struttura di 20 byte.