我需要编写一个函数,将“n”个元素的数组写入二进制输出文件。我想避免为我可能希望写入的每种数据类型(int、float、double 等)编写单独的函数。
有什么方法可以将数据类型(可能是字节数)指定为函数的参数,并让函数确定它如何处理它?
例如
f_writebinary(??? *data, int size, long n) {
for(i=0;i<n;i++) {
fwrite((data+i),size,1,stdout);
}
}
...或者这是对 C 的完全荒谬的期望?
最佳答案
是的,这正是 fwrite()
的作用。它使用 const 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 调用是否有错误。
如果您放弃 fwrite()
的 API 使用的“x 个元素的 y 个字节”模型,并将它们视为单个字节 block ,您可以简化调用:
fwrite(my_ints, sizeof my_ints, 1, stdout);
fwrite(my_doubles, sizeof my_doubles, 1, stdout);
请注意,循环没有意义,每个数组中的数字在内存中都是相邻的,因此 fwrite()
可以一次写入它们。通常最好尽可能地减少 I/O 调用的数量,因此如果您可以单次写入 n * m
字节而不是 n
写入每个 m
字节,这通常会更好。请记住,您写入的许多底层设备都是面向 block 的,并且会从获取整个数据 block 中获益良多,因为无论如何这是它们必须写入的内容。
关于我可以创建一个函数,它接受一个指向数组的指针,该数组在每次调用时可能包含不同类型的数字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16981619/