我有一个函数可以将一个二进制文件作为 void * 类型读入内存。文件头中的信息指示所需的内存量和实际数据类型(以每个数字的字节数为单位 - 例如,如果应将其解释为“长”,则为 8。
我的问题是,main 不知道所需的数据类型或内存。所以我这样调用函数:
long myfread(char *infile, void **tempdata,*datasize)
char *infile="data.bin"; // name of the input file
void *tempdata=NULL; // where the data will be stored, initially
long n; // total numbers read, returned by the function
size_t datasize; // modified appropriately by the function
n = myfread(infile,&tempdata,&datasize);
到目前为止一切顺利 - main 可以读取“tempdata”中的字节 - 但不能读取为(比如)整数或 float 。我的问题是,是否有一种简单的方法来重铸 tempdata 以实现这一点?
最佳答案
根据您编辑的问题,我可以猜测 myfread
是什么好像。极大地简化了,它做了这样的事情:
long myfread(const char *path, void **pmem, size_t *datasize) {
long magically_found = 42;
int *mem;
int i;
mem = malloc(magically_found * sizeof(int)); /* and we assume it works */
*datasize = 12345;
for (i = 0; i < magically_found; i++)
mem[i] = i;
*pmem = mem;
return magically_found;
}
现在,在您的 main
中,你必须以某种方式知道如果 datasize == 12345
返回时,分配的内存已填充 int
秒。知道这一点,你就可以简单地写:
int *ip;
... /* your code from above, more or less */
if (datasize != 12345) {
panic("memory was not filled with ints");
/* NOTREACHED */
}
ip = tempdata;
从这里您可以访问 ip[i]
, 对于任何有效的 i
(至少 0 且小于 n
)。
更棘手的问题是,您怎么知道 12345 表示 int
如果不是 12345,你怎么办?而且,可能 12345 并不意味着 int
反正。也许 4 表示 int or float
这两者恰好都有一个 sizeof
4 个,在这种情况下,有 datasize == 4
不告诉你到底是哪一个!那么,然后呢?
总而言之,这个问题听起来至少没有明确说明。
关于我可以将整个数组从 *void 重新转换为 *int 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16993785/