La soluzione proposta risolve il problema facendo uso delle direttive della [f]scanf() che puoi leggere nella documentazione della funzione [ad esempio qui].
In sostanza con la prima fscanf() legge un (eventuale) newline e una sequenza di massimo 256 caratteri fino al ; escluso (lo indica il [^;]) ponendo tali caratteri nel campo "key" di "item"; poi con la successiva fscanf() ancora un eventuale newline, un ; e un valore intero (%d) e così via fino alla fine della riga.

Un altro modo per risolvere il problema potrebbe consistere nel leggere il file riga per riga con una fgets(), tokenizzare ciascuna di esse con la strtok() e convertire le sottostringhe, laddove necessario, a int o float con le apposite funzioni atoi() e atof().