2012-09-12 14 views
0

我對C++比較陌生,我試圖讀取專有文件格式。我知道標題格式,並且創建了一個結構RTIHeader以及必要的字段。C++可能的內存泄漏讀取文件

我的測試代碼從文件中讀取字節並將它們複製到與結構體相同的內存空間中,從而有效地重構它。我的問題是,每次運行測試代碼(只是調用構造函數),我都會得到不同的值!我的理論是,我不完全明白memcpy

struct RTIHeader decode(char* memblock){ 
    struct RTIHeader header; 
    memcpy(&header,&memblock,sizeof(RTIHeader)); 
    return header; 
} 

RTIFile::RTIFile(const char* filename){ 
    // open the file in binary input mode with the pointer at the end 
    std::ifstream file(filename, 
         std::ios::in | 
         std::ios::binary | 
         std::ios::ate); 

    std::ifstream::pos_type size; 
    char * memblock; 
    RTIHeader header; 

    // if the file didn't open, throw an error 
    if(!file.is_open()){ 
     //TODO learn about C++ error handling 
     return; 
    } 
    // use pointer position to determine file size 
    size = file.tellg(); 
    // read file 
    memblock = new char [sizeof(RTIHeader)]; 
    file.seekg(0,std::ios::beg); 
    file.read(memblock,sizeof(RTIHeader)); 

    header = decode(memblock); 

    std::cout << (unsigned int)header.signature[0] << "\n"; 

    // still need to read the rest of the file 
    file.close(); 
} 
+0

我們需要RTIHeader的定義。 –

回答

2

您爲memcpy第二個參數傳遞的memblock地址。由於memblock是該函數的一個參數,因此您只需從堆棧中複製大塊內存。

要解決,只是通過直接指針:

memcpy(&header,memblock,sizeof(RTIHeader)); 

順便說一句,既然你是按值返回結構,您需要支付額外的memcpy的返回值將在完全複製(除非你的編譯器優化它)。爲了避免這種情況,你應該考慮通過目標結構的指針decode,如

struct RTIHeader *decode(struct RTIHeader *header, char* memblock){ 
    memcpy(header, memblock, sizeof(RTIHeader)); 
    return header; 
} 

然後你只需要做

decode(&header, memblock); 

這是更有效的。

+0

謝謝你,那太快了! SO告訴我我需要等待7分鐘才能接受你的答案,但那是確切的問題。 –

+0

感謝您的優化提示,非常有見識! –

+3

你也應該小心包裝。文件格式通常假定打包爲1(字段之間沒有間隔),但是代碼中的結構是使用默認打包(取決於您使用的工具)聲明的,並且可能與文件格式聲明的大小/佈局不一樣。 –