Здесь, позвольте мне исправить эти функции:
size_t fread_buf( void* ptr, size_t size, FILE* stream)
{
return fread( ptr, 1, size, stream);
}
size_t fwrite_buf( void const* ptr, size_t size, FILE* stream)
{
return fwrite( ptr, 1, size, stream);
}
Что касается обоснования параметров для fread()
/ fwrite()
, я давно потерял свою копию K & R, так что я могу только догадываться. Я думаю, что вероятный ответ заключается в том, что Керниган и Ричи, возможно, просто подумали, что выполнение бинарного ввода-вывода будет наиболее естественным образом выполнено для массивов объектов. Кроме того, они, возможно, думали, что блок ввода-вывода будет быстрее / проще реализовать или что-то еще на некоторых архитектурах.
Несмотря на то, что стандарт C указывает, что fread()
и fwrite()
должны быть реализованы в терминах fgetc()
и fputc()
, помните, что стандарт появился на свет намного позже того, как C был определен K & R, и что вещи, указанные в Стандартов не могло быть в оригинальных дизайнерских идеях. Возможно даже, что сказанное в «Языке программирования C» от K & R может не совпадать с тем, что было при разработке языка.
Наконец, вот что П. Дж. Плаугер говорит о fread()
в «Стандартной библиотеке C»:
Если size
(второй) аргумент больше единицы, вы не можете определить
может ли функция считывать до size - 1
дополнительных символов сверх того, что она сообщает.
Как правило, вам лучше вызывать функцию как fread(buf, 1, size * n, stream);
вместо
fread(buf, size, n, stream);
По сути, он говорит, что интерфейс fread()
не работает. В отношении fwrite()
он отмечает, что «ошибки записи, как правило, встречаются редко, поэтому это не является существенным недостатком» - с этим утверждением я бы не согласился.