C语言中的PGM文件处理

C语言中的PGM文件处理,c,malloc,fwrite,pgm,C,Malloc,Fwrite,Pgm,对于C语言,我尝试从命令提示符读取输入PGM文件(P2、P5或P6)和输出文件,然后将数据读取到缓冲区,最后将其写入输出文件。一切都在编译,但当我查看输出文件时,只有P2看起来像原始文件。P5和P6看起来像一团彩虹。我包括我的代码 #include <stdio.h> #include <stdlib.h> unsigned char* getPGMfile(char filename[], int *lwidth, int *lheight, int *lchanne

对于C语言,我尝试从命令提示符读取输入PGM文件(P2、P5或P6)和输出文件,然后将数据读取到缓冲区,最后将其写入输出文件。一切都在编译,但当我查看输出文件时,只有P2看起来像原始文件。P5和P6看起来像一团彩虹。我包括我的代码

#include <stdio.h>
#include <stdlib.h>

unsigned char* getPGMfile(char filename[], int *lwidth, int *lheight, int *lchannel);
int save(char filename[], unsigned char*data, int lwidth, int lheight, int lchannel);

int main(int argc, char **argv){
    int lwidth, lheight, lchannel;
    getPGMfile(argv[1], &lwidth, &lheight, &lchannel);
    unsigned char* data=(getPGMfile(argv[1], &lwidth, &lheight, &lchannel));
    printf("width, height, channel: %d %d %d\n",lwidth,lheight,lchannel);
    save(argv[2], data, lwidth, lheight, lchannel);
    return 0;
}

unsigned char* getPGMfile (char filename[], int *lwidth, int *lheight, int *lchannel){
        FILE *in_file;
        char ch;
        int row, col, type;
        int ch_int;
        in_file = fopen(filename, "r");
        if (in_file == NULL){
                fprintf(stderr, "Unable to open file %s\n\n", filename);
                exit(8);
        }
        printf("\nReading image file: %s\n", filename);
        ch = getc(in_file);
        if(ch != 'P'){
                printf("Not valid pgm/ppm file type\n");
                exit(1);
        }
        ch = getc(in_file);
        type = ch - 48;
        if((type != 2) && (type != 5) && (type != 6)){
                printf("Not valid pgm/ppm file type\n");
                exit(1);
        }
        while(getc(in_file) != '\n');
    while (getc(in_file) == '#'){
                while (getc(in_file) != '\n');
        }
        fseek(in_file, -1, SEEK_CUR);
    int width, height;
        fscanf(in_file,"%d%d", &width, &height);
    printf("width and heigth: %d %d\n", width, height);
    int intensity;
    fscanf(in_file,"%d", &intensity);
    printf("intensity: %d\n", intensity);

        unsigned char *data; 
        if(type == 2){
        *lchannel=5;
        int k=0;
            data = (unsigned char *) malloc((width*height)*sizeof(unsigned char));
                for (row=height-1; row >=0; row--)
                for (col=0; col<width; col++){
                        fscanf(in_file,"%d", &ch_int);
            data[k]=ch_int;k++;
 }
        }
        else if(type == 5){
        *lchannel=6;
                data=(unsigned char *) malloc(width*height*sizeof(unsigned char));
        fread(data, 1, (width*height), in_file);
        }
    else if(type == 6){
        *lchannel=6;
                data=(unsigned char *) malloc(3*(width*height)*sizeof(unsigned char));
        fread(data, 1, (3*(width*height)), in_file);
        }
        fclose(in_file);
        printf("\nDone reading file\n");
    *lwidth=width;
    *lheight=height;
    return data;
}

int save(char filename[],unsigned char *data, int lwidth, int lheight, int lchannel){
        FILE *fp;
    fp = fopen(filename, "wb");
    const int dimx = 800, dimy = 800;
    int i,j;
        if(lchannel == 5){
                fprintf(fp,"P5\n%u %u\n255\n", lwidth, lheight);
        fwrite(data,1,(lwidth*lheight),fp);
        printf("File %s saved.\n",filename);
        }
        else if(lchannel == 6){
        fprintf(fp,"P6\n%u %u\n255\n", lwidth, lheight);
        for(j=0;j<dimy;++j){
            for(i=0;i<dimx;++i){
                static unsigned char color[3];
                color[0]=i%256;
                color[1]=j%256;
                color[2]=(i*j)%256;
                fwrite(color,1,3,fp);
            }
        }
        printf("File %s saved.\n",filename);
        }
        fclose(fp);
    return(0);
    free(data);
}
#包括
#包括
无符号char*getPGMfile(char filename[],int*lwidth,int*lheight,int*lchannel);
int save(字符文件名[],无符号字符*数据,int lwidth,int lheight,int lchannel);
int main(int argc,字符**argv){
国际宽度、高度、L通道;
getPGMfile(argv[1]、&lwidth、&lheight和&lchannel);
无符号字符*数据=(getPGMfile(argv[1]、&lwidth、&lheight、&lchannel));
printf(“宽度、高度、通道:%d%d%d\n”、宽度、高度、通道号);
保存(argv[2],数据,lwidth,lheight,lchannel);
返回0;
}
无符号char*getPGMfile(char filename[],int*lwidth,int*lheight,int*lchannel){
文件*在_文件中;
char ch;
int行、列、类型;
int CHU int;
in_file=fopen(文件名,“r”);
if(in_file==NULL){
fprintf(stderr,“无法打开文件%s\n\n”,文件名);
出口(8);
}
printf(“\n正在读取图像文件:%s\n”,文件名);
ch=getc(在文件中);
如果(ch!=“P”){
printf(“无效的pgm/ppm文件类型\n”);
出口(1);
}
ch=getc(在文件中);
类型=ch-48;
如果((类型!=2)&&(类型!=5)&&(类型!=6)){
printf(“无效的pgm/ppm文件类型\n”);
出口(1);
}
while(getc(在文件中)!='\n');
while(getc(在_文件中)='#'){
while(getc(在文件中)!='\n');
}
fseek(在文件中,-1,SEEK\u CUR);
int宽度、高度;
fscanf(在_文件中,“%d%d”、&宽度和高度);
printf(“宽度和高度:%d%d\n”,宽度和高度);
智力强度;
fscanf(在_文件中,“%d”&强度);
printf(“强度:%d\n”,强度);
无符号字符*数据;
如果(类型==2){
*l通道=5;
int k=0;
数据=(无符号字符*)malloc((宽度*高度)*sizeof(无符号字符));
对于(行=高度-1;行>=0;行--)

对于(col=0;colfread大小应该是sizeof(unsigned char)而不是1。

删除了标记。是一个灵活的软件草图手册,是一种学习如何在视觉艺术环境中编码的语言。欢迎使用stackoverflow。您需要问一个特定的问题。“调试我的代码”这不是一个特定的问题。即使有人为您调试代码,但从长远来看对您没有帮助。您需要自己学习这样做。您是否在调试器中逐步完成代码?或添加调试打印?或任何其他调试步骤?当您的输入映像为p5或p6映像时,您会强制输出为p6映像。但在generator中,当图像为p6时,您明确地绘制了某种彩虹……您的问题到底是什么?您是否有强烈的愿望或要求编写自己的代码来读取和写入这些文件?因为已经提供了用于执行这些任务的漂亮、易用的库函数。
sizeof(char)
定义为1。参见6.5.3.4:操作员的
大小和
\u对齐,第4段