首页 > 解决方案 > 读取 PMG P5 文件的错误

问题描述

我已经非常努力了,这是我最好的尝试阅读 pmg P5 文件的方法。但在运行时,我似乎无法在读取过程中正确扫描 P5 文件。请帮我找出我的代码中的错误。

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

struct image{
    int nrow;
    int ncol;
    char s[10];
    int max;
    int **matrix;
};

int **mem_alloc(int,int);
void mem_dealloc(int **,int);
struct image *read_pgm(const char *,struct image *);
void write_pgm(const char *,const struct image *);

int main(){
    struct image *img;
    img=NULL;
    img=read_pgm("C:/MinGW/bin/image_P5.pgm",img);
    write_pgm("C:/MinGW/bin/write_P5.pgm",img);
    mem_dealloc((*img).matrix,(*img).nrow);
    printf("\nDone !\n");
    return 0;
}
int **mem_alloc(int nrow,int ncol){
    int **q;    
    int i,j;
    q=(int **)malloc(nrow*sizeof(int *));
    if(q==NULL){
        fprintf(stderr,"\nMemory allocation failure .\n");
        exit(EXIT_FAILURE);
    }
    for(i=0;i<ncol;i++){
        q[i]=(int *)malloc(ncol*sizeof(int));
        if(q[i]==NULL){
            fprintf(stderr,"\nMemory allocation failure .\n");
            exit(EXIT_FAILURE);
        }
    }
}

void mem_dealloc(int **q,int nrow){
    int i;
    for(i=0;i<nrow;i++){
        free(q[i]);
    }
    free(q);
}

struct image *read_pgm(const char *filename,struct image *img){
    FILE *fp;
    if((fp=fopen(filename,"rb"))!=NULL){
        int i,j;
        unsigned char *r;
        printf("56");
        fscanf(fp,"%s",(*img).s);
        printf("59");
        fscanf(fp,"%d%d%d",&((*img).ncol),&((*img).nrow),&((*img).max));
        printf("%s\n%d %d\n%d",(*img).s,(*img).ncol,(*img).nrow,(*img).max);
        r=(unsigned char *)malloc(sizeof(unsigned char)*((*img).ncol));
        (*img).matrix=mem_alloc((*img).nrow,(*img).ncol);

        for(i=0;i<(*img).nrow;i++){
            if(!(fread(r,sizeof(unsigned char),(*img).ncol,fp)==(*img).ncol)){
                fprintf(stderr,"\nDid not read line %d properly !.\n",i+1);
                exit(EXIT_FAILURE);
            }
            else{
                for(j=0;j<(*img).ncol;j++){
                    ((*img).matrix)[i][j]=((int)r[j] > 127)?(*img).max:0;
                }
            }
        }
        free(r);
        fclose(fp);
        return img;
    }
    else{
        fprintf(stderr,"\nCould not open file :\n");
        exit(EXIT_FAILURE);
    }

}

void write_pgm(const char *filename,const struct image *img){
    FILE *fp;
    if((fp=fopen(filename,"wb"))!=NULL){
        int i,j;
        unsigned char *w;
        fprintf(fp,"%s\n%d %d\n%d\n",(*img).s,(*img).ncol,(*img).nrow,(*img).max);

        w=(unsigned char *)malloc(sizeof(unsigned char)*((*img).ncol));

        for(i=0;i<(*img).nrow;i++){
            for(j=0;j<(*img).ncol;j++){
                w[j]=(unsigned char)((*img).matrix)[i][j];
            }
            if(fwrite(w,sizeof(unsigned char),(*img).ncol,fp)!=(*img).ncol){
                fprintf(stderr,"\nDid not read line %d properly .\n",i+1);
                exit(EXIT_FAILURE);
            }
        }
        free(w);
        fclose(fp);
    }
    else{
        fprintf(stderr,"\nCould not open file %s",filename);
        exit(EXIT_FAILURE);
    }
}

好的,所以我修好了!最终。这里和那里有一些愚蠢的错误,希望现在已经消失了!

标签: cstruct

解决方案


我没有查看所有代码,但我看到的主要错误是您将 NULL 指针传递给read_pgm(). 我不明白为什么img需要成为指针,所以简单的解决方案就是解决这个问题。您仍然将指向该结构的指针传递给read_pgm()read_pgm()不需要返回值。

int main(){
    struct image img;  // <- Not a pointer
    read_pgm("C:/MinGW/bin/image_P5.pgm", &img); // <- passing pointer to struct
    write_pgm("C:/MinGW/bin/write_P5.pgm", &img);
    .....

推荐阅读