是的,就是这样fwrite()
。它使用 aconst void *
表示“指向任何类型数据的指针”,并将其视为指向字节的指针。
因此,您的包装器并不是真正需要的,您可以立即进行正确大小的调用fwrite()
来写入数组:
const int my_ints[3] = { 1, 2, 3 };
const double my_doubles[5] = { 5, 4, 3, 2, 1 };
fwrite(my_ints, sizeof *my_ints, sizeof my_ints / sizeof *my_ints, stdout);
fwrite(my_doubles, sizeof *my_doubles, sizeof my_doubles / sizeof *my_doubles, stdout);
请注意,写入二进制数据stdout
可能有些粗鲁,而且应该检查 I/O 调用是否有错误。
如果您删除 API 使用的“y 字节的 x 元素”模型,fwrite()
并将它们视为单个字节块,则可以简化调用:
fwrite(my_ints, sizeof my_ints, 1, stdout);
fwrite(my_doubles, sizeof my_doubles, 1, stdout);
请注意,循环没有意义,每个数组中的数字将在内存中相邻,因此fwrite()
可以一次将它们全部写入。通常最好尽可能减少 I/O 调用的数量,因此如果您可以执行一次字节写入n * m
而不是每次n
写入m
字节,那通常会更好。请记住,您写入的许多底层设备都是面向块的,并且将从获取整个数据块中受益匪浅,因为无论如何这是他们必须编写的。