2012-11-18 4 views
0

나는 C++에서 벡터를 .bin 파일에 쓰고 싶습니다. 이 벡터의 유형은 byte이며, 바이트 수는 거대하거나 수백만이 될 수 있습니다. 나는 이런 식으로 일을하고있다 :바이트를 .Bin 파일로 작성

if (depthQueue.empty()) 
    return; 

FILE* pFiledep; 

pFiledep = fopen("depth.bin", "wb"); 

if (pFiledep == NULL) 
    return; 

byte* depthbuff = (byte*) malloc(depthQueue.size() * 320 * 240 * sizeof(byte)); 

if(depthbuff) 
{ 
    for(int m = 0; m < depthQueue.size(); m++) 
    { 
    byte b = depthQueue[m]; 
    depthbuff[m] = b; 
    } 

    fwrite(depthbuff, sizeof(byte), 
     depthQueue.size() * 320 * 240 * sizeof(byte), pFiledep); 
    fclose(pFiledep); 
    free(depthbuff); 
} 

depthQueue 바이트를 포함하고 그 크기는 100,000 말할 수 내 벡터이다.
가끔이 오류가 발생하지 않지만 bin 파일이 비어 있습니다.
가끔 힙 오류가 발생합니다.
때때로 이것을 디버깅 할 때 malloc이 공간을 할당하지 않는 것으로 보입니다. 공간에 문제가 있습니까?

순차 메모리의 청크가 너무 길어서 빈에 쓸 수 없습니까?

+0

왜 벡터를 버퍼에 복사합니까? 'depthQueue'는 어떤 타입입니까? –

답변

2

거의 필요하지 않습니다. vector 내용은 메모리에 연속을 보장받을 수 있습니다, 그래서 당신은 직접에서 쓸 수 있습니다 :

fwrite(&depthQueue[0], sizeof (Byte), depthQueue.size(), pFiledep); 

참고 코드에서 가능한 버그 : 벡터가 실제로 vector<Byte> 경우, 당신은 곱하지한다 그 크기는 320 * 240입니다.

편집 : fwrite() 호출에 더 많은 수정 사항 : 제 2 매개 변수가 이미 sizeof (Byte) 요소가 포함되어 있으므로 하나 (sizeof (Byte) 아마 한 경우에도 그렇게 중요하지 않습니다 3 매개 변수에 다시 곱셈을하지 않는다).

+0

동시성 :: concurrent_vector depthQueue; – user667222

+0

@ user667222 :'Concurrency :: concurrent_vector '가 무엇인지 모르겠다. - 문서가 동일한 연속성 보증을 제공하는지 확인해야한다. 또한 일치해야합니다 : 그것은'byte' 또는'Byte'입니까? –

+0

@ user667222 : 동시성을 다루는 것처럼 보이기 때문에 다른 스레드 나 프로세스가 벡터에 쓸 수 있다면'fwrite()'호출 전에 잠금을 설정하고 나중에 잠금을 해제해야합니다. –

관련 문제