2014-02-14 3 views
1

Так что я пытался написать что-то в stdout из моей p-> полезной нагрузки, которая должна быть указателем на данные. И block_size - 256.в C, fwrite() 'size_t size "и" size_t n items "confusion

Моя проблема в том, что мой stdout всегда будет точно таким же, если я переключу p-> block_size и sizeof (char). Может кто-нибудь сказать мне почему? Благодарю.

fwrite(p->payload, p->block_size,sizeof(char),stdout); 
+1

См. Также [«Как действительно работает fread?»] (Http://stackoverflow.com/q/8589425/827263) –

+0

Обратите внимание, что с аргументами 'p-> block_size' и' sizeof (char) ', если 'p-> block_size' равно' 1', изменение порядка аргументов изменяет значение, возвращаемое 'fwrite()'. Он сообщает количество элементов заданного размера, которые были написаны, поэтому в одном случае вы получите 'p-> block_size', возвращенный при успехе (и 0 при ошибке), а в другом вы получите' 1', возвращенный на успех (и 0 при ошибке). –

ответ

2

В общем, предположим, что будут записаны size * items байт.

Похоже, что это попытка отразить API fread, который также имеет параметры size и bytes. Для fread это более полезно, так как (например) вы можете попросить его прочитать один элемент из 1000 байтов - что означает «Я хочу точно 1000 байтов» - или вы можете попросить его прочитать 1000 предметов по одному байту за штуку -meaning «Я возьму до 1000 байт, меньше данных, чем это нормально». Разумеется, здесь можно использовать множество полезных комбинаций, если ваши данные будут фиксированными.

В случае fwrite, однако, единственный раз, когда вы ожидали бы меньше, чем size * items байт, которые будут записаны, будут в состоянии ошибки. В случае ошибок «полного диска» вы могли бы гипотетически выбрать size и items, чтобы вы пишете как можно больше полных элементов, но никогда не пишите полдела; однако я никогда не видел, чтобы кто-то действительно писал код, который работает таким образом и не просто терпит неудачу на диске.

0

По fwrite(3):

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

Функция fwrite() пишет nmemb элементы данных, каждый размер байт длиной, чтобы поток, на который указывает поток, получая их от места от ptr.

Это означает, что fwrite() будет писать «размер * nmemb» байтов из ptr в stream, потому что «размер * nmemb» равно «nmemb * размер», так что у вас есть такое же количество байтов, записанных в stream после переключился size и nmemb.

2

Разница - это значение, которое оно возвращает.

fwrite возвращает количество элементов данных, записанных.

При выполнении

count = fwrite(ptr, 1, N, stdout); 

count тогда будет содержать точное число байтов, успешно написанных. Если вы делаете:

count = fwrite(ptr, N, 1, stdout); 

count тогда будет содержать 1 если все записи удалось, или 0 если любой из него не удалось.

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

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

Смотрите также this similar question о fread.

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