E' la fscanf sbagliata ...

fscanf(fp,"%256[^;];%f;%f;%d\n", name, &val, &perc, &quant);



P.S. Indenta meglio il codice, distanzia le righe e raggruppale meglio perché così è veramente poco leggibile ...