【发布时间】:2015-08-28 11:13:05
【问题描述】:
我想读取一个 PGM 文件(没有 #cmets)并将图像数据(矩阵)导出到一个新的文本文件。到目前为止,我确实设法编写了代码,但我认为不是很好。 我的问题是,当我将矩阵从内存中打印到文本文件时,它会给我一些零行。当我想从内存中打印矩阵时也是如此。
有代码:
#include<stdio.h>
#include<stdlib.h>
int main(){
int i,j;
FILE *fd;
FILE *fdd;
//Extract the file info from header
char type;
int row=0,col=0,depht=0,a=0;
fd=fopen("file.pgm","rb");
fscanf(fd,"%s %d %d %d",&type,&row,&col,&depht);
//Malloc
int** sudo=(int **)malloc(row*sizeof(int *));
if ( sudo != NULL){
for (k=0; k<row ;k++){
sudo[k] =(int*) calloc (col,sizeof (int));
}
}
//Read the image data from the rest of the file
for(i=0;i<row;i++){
for(j=0;j<col;j++){
fscanf(fd,"%c ", &sudo[i][j]);
}
}
fclose(fd);
//
printf("Header:\nfile type: %s\nrow: %d\ncol: %d\ndepht: %d\n",&type,row,col,depht);
//Copy the matrix from memory to a new file
fdd=fopen("matrice.txt","wb");
for(i=0;i<row;i++){
for(j=0;j<col;j++){
fprintf(fdd,"%d ",sudo[i][j]);
}
fprintf(fdd,"\n");
}
free(sudo);
fclose(fdd);
return 0;
}
有什么想法吗?
【问题讨论】:
-
一个主要问题是您以二进制 模式打开PGM 文件,即使它是一个文本文件。这很可能会导致行尾出现问题,具体取决于您的平台和创建 PGM 文件的平台。当您写入新文件时也是如此,因为您以二进制模式打开它,所以您打印的换行符对于您所在的平台可能是错误的。
-
顺便说一句,和你的问题无关,但是你在程序结束时有内存泄漏。你释放了
sudo但不是sudo的内容(即sudo[0]、sudo[1]等)。 -
我也以正常模式打开文件。它的行为比二进制模式更糟糕(超过 3/4 的文件为零)。*修复了内存泄漏
-
你为什么用
%c输入,%d输出? -
看起来评论者可能会互相交谈,因为没有人提到有 2 种 pgm 格式的事实:原始(所有文本)和 rawbits(标题是文本,像素不是)。它们通过类型 P2 或 P5 进行区分。说到类型,你有一个
type变量,它是一个单一的char,你正在用%s读取它;那肯定会溢出。