2012-11-18 57 views
0

我有一個C++中的矢量,我想將它寫入.bin文件。 這個矢量的類型是byte,字節數可能很大,可能是數百萬。 我這樣做是這樣的:將Bytes寫入.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是我的載體,其包含字節,可以說,它的大小爲10萬。
有時候我沒有收到這個錯誤,但是bin文件是空的。
有時我得到堆錯誤。
有時,當我調試這個,似乎malloc不分配空間。 問題與空間有關嗎?

或者是連續內存塊很長,它不能在bin中寫入?

+0

爲什麼你將矢量複製到緩衝區中呢?什麼類型是'depthQueue'? –

回答

2

你幾乎不需要這些。 vector內容都保證在內存中連續的,所以你可以從它直接寫:

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

注意,在你的代碼中可能的錯誤:如果向量確實vector<Byte>,那麼你不應被乘以其大小由320 * 240。

編輯:修正更多的fwrite()電話:第2個參數已經包含sizeof (Byte)因素,所以不要再這樣做乘法的第三個參數是(即使sizeof (Byte)大概是1,因此也無所謂)。

+0

併發:: concurrent_vector depthQueue; – user667222

+0

@ user667222:我不知道'Concurrency :: concurrent_vector'是什麼 - 您需要檢查它的文檔以查看它是否提供了相同的連續性保證。也可以保持一致:它是'byte'還是'Byte'? –

+0

@ user667222:鑑於你似乎在處理併發性,如果任何其他線程或進程可以寫入向量,你可能需要在'fwrite()'調用之前將其鎖定,然後解鎖。 –