2013-07-03 115 views
3

我不知道爲什麼這是行不通的。從我可以告訴,它似乎並沒有讀取整個圖像文件...雖然我不知道。我基本上有一些原始的圖像,我想讀到堆上。閱讀整個std :: ifstream堆

unsigned char* ReadImageFromFile(const char* FILENAME, unsigned int SIZE_BYTES) 
{ 
    unsigned char *data = (unsigned char*) malloc(SIZE_BYTES); 

    std::ifstream image(FILENAME); 
    image.read((char*) data, SIZE_BYTES); 
    image.close(); 

    return data; 
} 
+4

停止混合C與C++,它將工作。 – Griwes

+5

首先,如果你使用C++,請不要使用malloc(),我們有新的。這就是說,檢查image.read的返回值 - 它是否返回SIZE_BYTES或更少?如果您正在讀取原始數據,則可能需要以二進制模式打開文件。 – Alex1985

+5

@ Alex1985,不,我們有比「新」更好的原語。我們有容器,我們有聰明的指針 - 「新」幾乎從來不是答案。 – Griwes

回答

6

1)以二進制方式打開文件

2)不返回需要釋放

std::string readImageFromFile(const char* filename) 
{ 
    std::ifstream image(filename, std::ios::binary); 
    std::ostringstream data; 
    data << image.rdbuf(); 
    return data.str(); 
} 

或者,如果你喜歡寫容易出錯的代碼(似乎是一個原始指針深受嵌入人羣歡迎)你可以這樣做:

char* readImageFromFile(const char* filename) 
{ 
    std::ifstream image(filename, std::ios::binary); 
    std::ostrstream data; 
    data << image.rdbuf(); 
    data.freeze(); 
    return data.str(); 
} 

當然,有一個很好的理由strstreams已被棄用。

+0

我需要返回一個原始ptr。我不想要一個std :: string。我可能應該提到這個代碼在微處理器上運行。 –

+1

好的,回答更新以避免'std :: string',如果你喜歡這種方式 –

+0

它肯定是受歡迎的嵌入式的人羣!說實話,我真的需要它,因爲我使用的是opencv,而且我需要用指向該文件的指針拍攝cv :: Mat的數據指針。 –

3

嘗試std::ifstream image(FILENAME, std::ios_base::binary);(注意第二個參數ifstream構造函數)。