2015-04-25 2 views
3

При чтении документации для freadhere объясняется, что два аргумента после void *ptr умножаются вместе для определения количества байтов, которые читаются/записываются в файл. Ниже приведен заголовок функции для fread приведены по ссылке:Значимость двух аргументов в fread?

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 

Мой вопрос, кроме возвращаемого значения из функции, есть на самом деле разница поведения или производительности между вызовом каждой из них:

// assume arr is an int[SOME_LARGE_NUMBER] and fp is a FILE* 
fread(arr, sizeof(arr), 1, fp); 
fread(arr, sizeof(arr)/sizeof(int), sizeof(int), fp); 
fread(arr, sizeof(int), sizeof(arr)/sizeof(int), fp); 
fread(arr, 1, sizeof(arr), fp); 

И какой из них обычно будет лучшей практикой? Или более общий вопрос: как я могу решить, что указать для каждого аргумента в любом данном сценарии?

EDIT

Чтобы уточнить, я не прошу для обоснования двух аргументов вместо одного, я прошу общий подход на принятие решения, что перейти к аргументам в любом сценарии. И this answer, что Массимилиано, связанный в комментариях и цитируемый, содержит только два конкретных примера и недостаточно объясняет, почему это происходит.

+0

* Поведение * отличается, но поскольку вы не проверяете наличие ошибок, вы не можете его увидеть. * Производительность * зависит от конкретной используемой библиотеки. В отмеченной как дублируется заявляется, что «fread внутренне работает через« fputc », что, возможно, было истинным изначально, но с которым трудно поверить, чтобы держаться в 21 веке. – usr2564301

+0

Затем взгляните на второй ответ по ссылке;) – Massimiliano

+0

@ Массимилиано, который определяет только два особых случая, и, как отмечали комментаторы, этот ответ мог бы значительно улучшить. –

ответ

3

Существует разница в поведении, если для удовлетворения запроса недостаточно данных. С страницы, которую вы указали в:

Общее число успешно прочитанных элементов возвращается как объект size_t, являющийся интегральным типом данных. Если это число отличается от параметра nmemb, то либо произошла ошибка, либо был достигнут конец файла.

Так что, если вы укажете, что есть только один элемент размера sizeof(arr), и нет достаточного количества данных для заполнения arr, то вы не получите возвращены какие-либо данные. Если вы делаете:

fread(arr, sizeof(int), sizeof(arr)/sizeof(int), fp); 

затем arr будет частично заполнен, если нет достаточного количества данных.

Третья строка вашего кода наиболее естественно соответствует API fread. Однако вы можете использовать одну из других форм , если у вас у вас есть документ , почему вы не делаете нормальную вещь.

+0

Да. Фиксация. Благодаря! –

Смежные вопросы