2012-07-25 47 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