2012-04-11 274 views
-1

我試圖將(雙)的矩陣轉換成一個無符號的字符,然後我可以寫入一個.pmg文件...但它不工作。將double轉換爲unsigned char?

void writePNG(vector<double>& matrix) 
{ 
vector<unsigned char> image; 
ofstream myfile; 

myfile.open("newFile.txt", ios::out); // writing to .txt file for now for testing. 

if(!myfile.is_open()) 
{ 
    cout << "Cannot open file"; 
} 
for(int i=0; (i < 512*512); i++) 
{ 
    image[i] = (unsigned char) matrix[i]; 
} 

myfile.close(); 
} 

它不會轉換數據。有任何想法嗎??謝謝:)

+0

到底是什麼錯誤?是否有編譯器錯誤?該文件是否爲空(這肯定是這種情況,因爲您不寫任何內容)?有沒有運行時錯誤? – alfa 2012-04-11 14:45:48

+0

將聲明更改爲'vector 圖像(512 * 512);'。 – 2012-04-11 14:46:16

+0

那麼你看到的錯誤是什麼?矩陣向量中值的範圍是什麼?例如。如果-1 ... 1,那麼你需要首先縮放值。 – 2012-04-11 14:47:48

回答

2
  • 錯誤:您正在創建大小爲0的向量,然後寫入其不存在的元素。
  • 錯誤:你永遠不將數據寫入到文件
  • 風格:您不必要關閉文件。當fstream對象超出範圍時,它將被關閉
  • 樣式:您在循環中複製數據。使用vector::vector可更清楚地顯示您的意圖。
  • 潛在的bug:無論輸入矢量的大小如何,您都可以創建一個512x512的輸出矢量。
  • SSCCE您的測試用例不完整。

試試這個:

#include <vector> 
#include <iostream> 
#include <fstream> 

void writePNG(const std::vector<double>& matrix) 
{ 
    std::ofstream myfile("newFile.txt", std::ios::out); 

    if(!myfile.is_open()) 
    { 
    std::cout << "Cannot open file"; 
    } 
    std::vector<unsigned char> image (matrix.begin(), matrix.end()); 
    myfile.write(reinterpret_cast<const char*>(&image[0]), image.size()); 
} 

int main() { 
    writePNG({ 
    72, 101, 108.1, 108.2, 
    111, 0x2c, 0x20, 0x77, 
    0x6f, 0x72, 0x6c, 
    100.3, 10.4}); 
} 
+0

難道你不能使用static_cast ()而不是'reinterpret_cast <>'? – Attila 2012-04-11 17:16:13

+0

不,我需要'reinterpret_cast'作爲不相關的指針類型。 – 2012-04-11 17:21:39

0

你的圖像矢量具有零大小 - 你將不得不至少做一個push_back來添加一個元素。此外,double的大小與char的大小不同,因此您將失去信息。

1

您正在使用vector的默認構造函數創建image,該構造函數將向量初始化爲空(不包含元素)。下標符號(image[i])不會創建元素,只會分配給已經存在的元素。

你有(至少)兩種方式來解決這個問題:

  • 聲明image使用vector,其分配所需的大小的構造函數:vector<unsigned char> image(512*512) - 這將填充默認的512個* 512元素的矢量值(0用於unsigned char
  • 添加元素一個接一個使用push_back方法:image.push_back((unsigned char) matrix[i]);

你也必須令e最終的imagemyfile的內容。

注意:使用static_cast<unsigned char>(...)代替C型(unsigned char) ...是個好習慣,因爲前者可以發現後者不會標記的錯誤;這是不是在這種特殊情況下的問題,雖然

相關問題