У нас была дискуссия на работе о том, почему fread и fwrite принимают размер для каждого члена и подсчитывают и возвращают число членов, читаемых/написанных, вместо того, чтобы просто брать буфер и размер. Единственное, что мы могли бы придумать, - это если вы хотите читать/писать массив структур, которые неравномерно разделены выравниванием платформы и, следовательно, были дополнены, но это не может быть так распространено, чтобы гарантировать этот выбор в дизайне.
Из FREAD (3):
Функция fread() считывает nmemb элементы данных, каждый размер байтов длиной, из потока, на который указывает поток, сохраняя их в указанном месте по ptr.
Функция fwrite() записывает nmemb элементы данных, каждый размер байтов долго, к потоку, на который указывает поток, получая их из местоположения заданный ptr.
fread() и fwrite() возвращают количество элементов, успешно прочитанных или написанных (т.е. не количество символов). Если возникает ошибка или конец файла достигнут, возвращаемое значение - короткое количество элементов (или ноль).