在`fwrite()`中同时包含参数大小和nmemb的目的是什么?

时间:2019-02-15 13:49:21

标签: c fwrite

fwrite()被声明为此。

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

但是实际写入的字节数仅为大小* nmemb。那么,为什么不只指定字节数呢?为什么必须同时指定大小和nmemb?谢谢。

3 个答案:

答案 0 :(得分:0)

没有真正的原因。

以这种方式定义函数只是因为它是;更具体地说,如果不是所有元素都被写入时发生错误,则不能保证没有部分元素被写入或文件指针在任何特定位置。

我通常只需将元素大小设置为1,然后自己在count参数中进行计算即可。

答案 1 :(得分:0)

我认为这取决于机器的字节序。 fwrite()写入size * nmemb个字节。也就是说,调用以下两个函数会得到相同的结果。

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

但是,棘手的一点是接下来的调用,fwrite(ptr, 1, 1, buf);将字节写入最低内存地址。也就是说,它是big-endian计算机上的最高有效字节。否则,它是最低有效字节。

答案 2 :(得分:-1)

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纠正了我以前的回答。