Tivemos uma discussão aqui no trabalho sobre por que fread e fwrite assumem um tamanho por membro e contam e retornam o número de membros lidos / escritos em vez de apenas pegar um buffer e tamanho. O único uso que podemos sugerir é se você quiser ler / gravar um conjunto de estruturas que não são divisíveis uniformemente pelo alinhamento da plataforma e, portanto, foram preenchidas, mas que não podem ser tão comuns a ponto de justificar essa escolha no design.
De FREAD (3) :
A função fread () lê nmemb elementos de dados, cada um com tamanho em bytes, do fluxo apontado por stream, armazenando-os no local fornecido por ptr.
A função fwrite () grava nmemb elementos de dados, cada tamanho bytes de comprimento, para o fluxo apontado por stream, obtendo-os da localização fornecida por ptr.
fread () e fwrite () retornam o número de itens lidos ou gravados com sucesso (ou seja, não o número de caracteres). Se ocorrer um erro ou se o fim do arquivo for atingido, o valor de retorno será uma contagem curta de itens (ou zero).