fwrite()
被声明为此。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
但是实际写入的字节数仅为大小* nmemb。那么,为什么不只指定字节数呢?为什么必须同时指定大小和nmemb?谢谢。
答案 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纠正了我以前的回答。