Negli ordinamenti perché usi N ?
Non è detto che leggi N righe dal file ... devi utilizzare il numero effettivo di righe lette.

E delle righe come

for(i=0;i<=cnt;i++) {

devono essere

for(i=0;i<cnt;i++) {