Какова цель иметь в параметре fwrite () оба параметра paramers size и nmemb? - PullRequest
0 голосов
/ 15 февраля 2019

fwrite() объявляется как это.

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

Но фактическое число записанных байтов - просто размер * nmemb.Так почему бы просто не указать количество байтов?Почему нужно указывать как размер, так и nmemb?Спасибо.

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

Нет реальной причины.

Функция определена таким образом только потому, что она есть;более конкретно, в случае ошибок, когда не все элементы записаны, вы не гарантируете, что частичный элемент не был записан или указатель файла находится в каком-либо конкретном месте.

Обычно я просто передаю размер элемента как1 и выполните вычисления самостоятельно в параметре count.

0 голосов
/ 16 февраля 2019

Я думаю, что это зависит от порядка машин.fwrite() записывает size * nmemb байтов.То есть вызов следующих двух функций приводит к одному и тому же результату.

fwrite(ptr, 2, 10, buf);
fwrite(ptr, 10,2, buf);

Тем не менее, сложный момент заключается в следующем вызове, fwrite(ptr, 1, 1, buf); записывает байт по младшему адресу памяти.То есть это самый значимый байт на машине с прямым порядком байтов.В противном случае это младший байт.

0 голосов
/ 15 февраля 2019

https://chromium.googlesource.com/chromiumos/third_party/glibc/+/cvs/libc-970216/stdio/fwrite.c

Как вы можете видеть в различных реализациях fwrite (не только по ссылкам выше), возвращаемый ответ - return (size_t) written / size;.Таким образом, в случае успеха вы получите возвращенное значение nmemb.

Пример:

#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>

int main() {

    int num = 2;
    uint64_t *arr = malloc(num * sizeof(uint64_t));
    arr[0] = (uint64_t)'a' ^ (uint64_t)'b' << 8 ^ (uint64_t)'c' << 16;
    arr[1] = (uint64_t)'d' ^ (uint64_t)'e' << 8 ^ (uint64_t)'f' << 16;

    size_t writed_size = 0;
    writed_size = fwrite(arr, sizeof(arr), num, stdout);
    if (writed_size == num) {
        printf(" : Success\n");
    }

    writed_size = fwrite(arr, 1, sizeof(arr) * num, stdout);
    if (writed_size == sizeof(arr) * num) {
        printf(" : Success\n");
    }
    writed_size = fwrite(arr, sizeof(arr) * num, 1, stdout);
    if (writed_size == 1) {
        printf(" : Success\n");
    }

    free(arr);

    return 0;
}

Спасибо @Eric Postpischil за исправление моего предыдущего ответа.

...