2013-02-24 87 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