(sto un po' arruginito col C...)

se aggiungessi il \n alla fine del format della scanf?

cioè:

fscanf(fp,"%ld%s%s%s%d\n",&matr,cognome,nome,cod,& voto) != EOF

fscanf torna 0 se trova caratteri da leggere ma il match con il formato non va a buon fine...
siccome come ultimo match leggi un intero il \n viene ignorato, quindi rimane come carattere pendente che alla successiva scansione viene associato al &ld , fallendo...

magari sto dicendo cavolate...anche perchè questo non spiega perchè agli altri funziona XD

ma alla fine tentar non costa nulla