Why does your fread to anything other than multiplying the two arguments?

The idea of having two arguments to fread() is presumably to be able to do something else than all-or-nothing when there's a short read.

Yes, it divides the bytes read by the element size to get the return value.

Which is the obvious reason you'd pass an element size of 1: you want to know how many bytes were read.