带参数的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,这样改来就是上面的程序了。

浙公网安备 33010602011771号