2013-02-24 149 views
1

我是新來申請,並沒有太多的想法。如何讀取/寫入ASCII .pgm文件

我寫了嘗試讀取名爲owl.pgm一個ASCII .PGM文件,並將其寫入爲myowl.pgm文件代碼:

#include <fstream> 
const int MAXHEIGHT=221; 
unsigned char *bitmap[MAXHEIGHT]={'\0'} ;// pointers to each pixel row 
int main() 
{ 
    int width=201, height=221; 
    std::ifstream ifile("owl.pgm",std::ios::in); 
    std::ofstream ofile("myowl.pgm",std::ios::out); 
    for(int i=0;i<height;++i) 
    { 
     for(int j=0;j<width;++j) 
      ifile.read(bitmap[i][j],sizeof(bitmap)); 
    } 
    ofile << "P2\n" << width << " " << height << "\n255\n"; 
    for(int i=0;i<height;++i) 
    { 
     for(int j=0;j<width;++j) 
      ofile<<bitmap[i][j]; 
    } 
} 

通過我的代碼中有一些錯誤。如果有人幫我糾正錯誤,我會很感激。

回答

2

這個問題似乎是在你閱讀從輸入文件像素的方式:

std::ifstream ifile("owl.pgm",std::ios::in); 
for(int i=0;i<height;++i) 
{ 
    for(int j=0;j<width;++j) 
     ifile.read(bitmap[i][j],sizeof(bitmap)); 
} 

問題1:你需要確保你的程序不把這個文件作爲實際像素的頭的形象。請參閱PGM的標題格式。讀取像素之前,您很可能必須先跳過前3行。

問題2:您正試圖一次讀取整個位圖,但是您在嵌套循環中執行該操作,顯然意味着要逐像素讀取位圖。

像素的閱讀可能看起來像這個:

for(int i = 0; i < height; ++i) 
{ 
    for(int j = 0; j < width; ++j) 
     ifile >> bitmap[i][j]; 
} 
+0

我的程序執行時,我得到一個錯誤「未處理的異常在0x00418019中owl.exe:0000005:訪問衝突寫入位置00000000。」我已經根據你的建議更改了代碼。你現在能幫我解決這個錯誤嗎? – zorroz 2013-02-25 11:25:34

+0

@ zorroz:很難說這裏的問題究竟是什麼。用我的回答,我只想指出,在閱讀實際數據之前,你應該考慮標題+展示了一種可能的方法,它可以爲你提供正確的方向。如果您遇到此訪問衝突並無法正常工作,請將其作爲新問題發佈:) – LihO 2013-02-25 11:55:25

+0

好的。謝謝LiHo – zorroz 2013-02-25 13:52:08