if i remember right, feof is executed after a failed fread instruction because of an feof error.

==>

while(!feof(fp))
{
long length;
fread(&length, sizeof(long), 1, fp);
if(feof(fp)) { break; }

no very elegant, but.. it should work