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

原文地址:https://www.cnblogs.com/zerocc/p/1914784.html