2012-07-25 2 views
1

파일 로더에서 작업 중이었고 fread 및 fseek를 계속 사용하는 대신 다음 업데이트를 사용하는 것이 더 좋다고 결정한 경우 BYTE 버퍼에 구멍 파일을 읽습니다. 내가 구조체에이 BYTE 버퍼의 일부를 할당하는 쉬운 방법이 없는지 궁금 해서요.구조체에 BYTE 버퍼의 특정 부분 복사 +

나는 이미 구조체와 같은 크기의 임시 버퍼를 만들려고했는데 원래의 버퍼에서 필요로하는 모든 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

처럼 할당 배열 어디에 코드가 delete[]에 잊지 마십시오 간단한 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); 

로 대체 될 수있다? –

+0

** 편집 ** 오류를 발견했습니다. 오류가 memread 함수에 있었지만 이제는 수정했습니다. 죄송합니다. 누군가가 관심 있으면 코드를 수정했습니다! – user1509548

+0

BTW : 이것을 읽으려고하는 유명한 Fast Tracker XM 형식입니까? –

답변

0

REAL 코드입니다. (당신은 임시 버퍼를 해제하지 않는 곳!) 그런 다음, memreadtempmemory

+0

오, 정말로?와, 나는 그 대답이 너무 쉬웠다는 것을 믿을 수 없다! 내 친구, 또 고마워. – user1509548

+0

내 구조 안에, 나는 단어와 DWORDS를 가지고 있는데 memcpy를 사용하면 자동으로 BYTES를 단어와 DWORS로 변환 할 것인가? – user1509548

+0

예.하지만 데이터 정렬과 엔디안을 조심해야합니다. 당신은 구조체가 바이트 정렬되도록 컴파일러에게 알려야 할 것이다. 그렇지 않으면 문제가 생길 것이다. f.e. 파일이 빅 엔디안이고 리틀 엔디안으로 읽는 경우 WORD 또는 DWORD의 모든 바이트를 바꿔야합니다. –