Lettura e scrittura tramite struct è possibile a condizione di mantenere i campi fissi, altrimenti anche il sistema di scrittura e/o lettura dev'essere dinamico.codice:struct esempio { int ID; stringa arrayDiNomi[4]; };
Rendere dinamico arrayDiNomi significa solo cercare rogne. Dovresti trasformarlo in un puntatore e allocarlo con la malloc, però quando leggerai con la fread, il puntatore sarà sovrascritto e perderai la memoria puntata; nel puntatore ci sarà spazzatura (non quello che intendi leggere) e sicuramente prima o poi avrai un crash.
Se le stringhe che vuoi leggere sono precedute da un intero, potresti leggere prima l'intero ed effettuare una successiva fscanf con un buffer adeguatamente dimensionato.