2012-07-25 51 views
1

我在我的文件加载器的工作,我决定还是用FREAD和FSEEK读孔文件到一个字节的缓冲区,因此对于下一更新,而不是保持较好我做了什么,现在我想知道是否没有简单的方法将这个BYTE缓冲区的一部分分配给一个结构。复制一个字节的缓冲区,以结构的特定部分+

我已经尝试制作一个与结构体大小相同的临时缓冲区,将需要从原始缓冲区中取出的所有字节复制到它,然后使用memcpy,但它没有正常工作,我刚收到很多随机数(我认为我收到他们的指针,但我不知道对)。

谢谢你的时间!

编辑:真正的代码

void memread(BYTE from[],int pos, void * to,size_t size) 
{ 
    BYTE * temp = new BYTE[sizeof(BYTE)*size]; 

    for (unsigned int i = 0; i< 1+size; i++) 
     temp[i] = from[i+pos]; 

    memcpy(to,temp,size); 

} 


... inside the file loader ... 


fseek(fl,0,SEEK_END); 
const int memory_size = (int)ftell(fl); 


BYTE * memory = new BYTE[sizeof(BYTE)*memory_size]; 
fseek(fl,0,SEEK_SET); 

for (int i=1;i<=memory_size;i++) 
fread(&memory[i],sizeof(BYTE),1,fl); 

fclose(fl); 

int memory_pos = 0; 

XM::Memory xm; 
memset(&xm,0,sizeof(XM::Memory)); 


memread(memory,1,&xm.Header,sizeof(XM::Header)); 
+0

哪里码? – 2012-07-25 18:11:41

+0

**编辑**发现错误,错误发生在memread函数中,现在我已经修复它,对任何事都抱歉!我修正了代码,如果有人感兴趣! – user1509548 2012-07-25 18:19:43

+0

BTW:这是你试图阅读的着名的Fast Tracker XM格式吗? – 2012-07-25 18:28:58

回答

0

首先,你正在阅读的字节文件字节,这将给你一个坏的表现。接下来,您memread(你不释放临时缓冲区!),可以通过简单的memcpy

fseek(fl, 0, SEEK_END); 
const int memory_size = (int)ftell(fl); 

BYTE* memory = new BYTE[sizeof(BYTE) * memory_size]; 
fseek(fl, 0, SEEK_SET); 

fread(memory, sizeof(BYTE), memory_size, fl); 

fclose(fl); 

int memory_pos = 0; 

XM::Memory xm; 
memset(&xm, 0, sizeof(XM::Memory)); 

memcpy(&xm.Header, memory + memory_pos, sizeof(XM::Header); 

取代永远不要忘记给你的delete[]分配数组一样tempmemory

+0

哦,真的吗?哇,我不能相信答案是那么容易!谢谢我的朋友,还有,我还有一个问题。 – user1509548 2012-07-25 18:24:34

+0

在我的结构里面,我有一些WORDS和DWORDS,使用memcpy它会自动将BYTES转换成WORDS和DWORDS? – user1509548 2012-07-25 18:25:43

+0

是的,但您必须留意数据对齐和字节顺序。你将不得不告诉你的编译器,你希望结构是字节对齐的,否则你会遇到麻烦。如果f.e.该文件是big-endian,并且您正在阅读它为little-endian,WORD或DWORD中的所有字节将不得不交换。 – 2012-07-25 18:27:48