带参数的main函数(二)
#include <stdio.h> #include <string.h> //mesmet #include <stdlib.h> //malloc typedef char BYTE ; typedef float WORD ; int main(int argc,char *argv[]) { int i,j,h; FILE *fp1,*fp2; int aa,bb,k,d,result; sscanf(argv[2],"%d",&aa); //输入行号 sscanf(argv[3],"%d",&bb); //输入列号 sscanf(argv[4],"%d",&k); //输入波段号 sscanf(argv[5],"%d",&h); //要取的波段号 d=aa*bb; BYTE *data1=(BYTE *)malloc (d*k*sizeof(BYTE)); WORD *data2=(WORD *)malloc (d*sizeof(WORD)); BYTE *filename=(BYTE *)malloc(20*sizeof(BYTE)); if((fp1=fopen(argv[1],"rb"))==NULL) { printf("Can not open file!\n"); return 0; } //初始化 memset(data1,0,d*k*sizeof(BYTE)); memset(data2,0,d*sizeof(WORD)); memset(filename,'\0',20*sizeof(BYTE)); fseek(fp1,512*512L,SEEK_SET); //指针定位,每次偏移512*512个字符位置 // sprintf(filename,"%s%d",argv[6],i); sprintf(filename,"%s%d",argv[6],h); if((fp2=fopen(filename,"wb"))==NULL) { printf("Can not open file!\n"); return 0; } //每次读一块,即512*512 fread(data1,sizeof(BYTE),d,fp1); //转换为实型 for(j=0;j<512*512;j++) { data2[j]=((int)data1[j])*1.0; } //把一块数据从fp2写到文件中 fwrite(data2,sizeof(WORD),512*512,fp2); //只写出要读的波段 fclose(fp1); fclose(fp2); free(data1); free(data2); free(filename); return 0; }
最初是在上次写的代码基础上面进行的,输出是六个,用的for循环。改的时候想的是里面是连续存储的,如果要写只要写要读的那一个就可以,但是这样没有写的还是会自动的建立空白的文件n个。之后就是把我的问题说了,然后问的同学。因为读的时候图片的地址是连续的。可以把指针重新定位一下。用fseek,这样改来就是上面的程序了。