c - 读取 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);
}
}
好的,所以我修好了!最终。这里和那里有一些愚蠢的错误,希望现在已经消失了!
解决方案
我没有查看所有代码,但我看到的主要错误是您将 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);
.....
推荐阅读
- html - PHP : 替换字符 – 在 wordpress "the_content" 中后跟几个非中断空格
- python - 检测字符串中的火焰
- sql - 为什么 SELECT 'foo' + NULL; 在 SQL Server 上返回 NULL
- python - Parallel iteration for nested tuples in python
- swift - 如何从 MPRemoteCommandEvent 设置播放时间?
- css - CSS - 有没有更好的方法来创建从框的边缘出现和消失的滚动重复文本?
- uwp - 我应该如何使用 Rx + DynamicData 定期检查来自许多在线服务的更新?
- dart - DragTarget onWillAccept 和 onAccept 不触发
- python - 在 Python 中改变 np.array 的结构
- javascript - 从多个api获取数据