fits文件读取代码

FITS (Flexible Image Transport System) 是国际天文学会(IAU)1982 年确定的世界各天文台之间用于数据传输、交换的统一标准格式。它描述了数据的定义和数据编码的一般方法。它是与机器无关的,用磁带作为标准传输介质的独立方法。它提供了图象的单值转换,精度包括符号在内可以达到 32 位。对一维、二维、三维、甚至多维的数据类型都提供了合适的转换。它不仅适用于天文数据, 对其他学科的数据也是可用的。 
 

#include "stdio.h"
#include "string.h"
#include <io.h>
#include <fcntl.h>
#include <stdlib.h>
#include "read.h"
struct bdata
{
	char name[9];
	char type[9];
};

void main()
{
	int     decimal,   sign,    precision = 10;
	int tablen,fh,newfh,line=0,fline,ttime=0,time;
	int fileno=0,tmpi=0,tmpj=0,tmpk=0,datasign=0;
	long curpos=0,sof=0,datalnth=0;
    char buffer[80]="",buffer2[11]="",*buffer3="",filename[80]="",head[6]="",*retn="\n";
	char dd[8]="",ee[4]="",jj[4]="",ii[2]="",aa[1]="";
	char ddtmp[9]="",eetmp[5]="",jjtmp[5]="",iitmp[3]="";
////////////////////////////////	
	double ddn=0;
	float een=0;
	long  jjn=0;
	int   iin=0;
////////////////////////////////
	printf("input the file NO:");
	scanf("%d",&fileno);
	strcpy(filename,"file");
	_itoa(fileno,buffer,10);
	strcat(filename,buffer);
	strcat(filename,".dat");
	ttime=getnum(filename);
	tablen=getfield(filename);
	getname(filename,buffer);
	strcat(buffer,".dat");
	fh = _open(filename,_O_RDONLY|_O_BINARY);
	newfh=_open(buffer,_O_CREAT|_O_RDWR );
    bdata *newtb;
	newtb=new bdata[tablen];
/////////////////////////////////////////	
	sof=_filelength(fh);
	fline=sof/16;
	_lseek(fh,curpos,SEEK_SET);
	_read(fh,buffer,80);
	line+=5,curpos+=80;
	strncpy(head,buffer,5);
	head[5]='\0';
	while(line<fline)
	{
		if(strcmp(head,"END  ")==0)
		{
			datasign=1;
			_write(newfh,buffer,80);
		}
		/////////////////////////////////////////////////reading data///////////////////////////
		if(datasign==0)
		{
			if(strcmp(head,"TTYPE")==0)
			{
				for(tmpj=0;tmpj<8;tmpj++)
					newtb[tmpi].name[tmpj]=buffer[11+tmpj];
				newtb[tmpi].name[8]='\0';
			}
			if(strcmp(head,"TFORM")==0)
			{
				for(tmpk=0;tmpk<8;tmpk++)
				{
					newtb[tmpi].type[tmpk]=buffer[11+tmpk];
				}
				newtb[tmpi].type[8]='\0';
				tmpi++;
			}
			 _write(newfh,buffer,80);
			 _write(newfh,"\n",1);
			 _lseek(fh,curpos,SEEK_SET);
			 _read(fh,buffer,80);
			 line+=5,curpos+=80;
			 strncpy(head,buffer,5);
		}
		else  //binary  data  begin  reading
		{
			_write(newfh,"\nBINARY DATA:\n",14);
			_lseek(fh,curpos,SEEK_SET);
			_read(fh,buffer,16);
			line++,curpos+=16;
			buffer[16]='\0';
			while(strcmp(buffer,"                ")==0)
			{
				_lseek(fh,curpos,SEEK_SET);
			    _read(fh,buffer,16);
			    line++,curpos+=16;
			    buffer[16]='\0';
			}
			line--,curpos-=16;
			_lseek(fh,curpos,SEEK_SET);
			for(time=0;time<ttime;time++)
			{
			      for(tmpj=0;tmpj<tablen;tmpj++)
				  {
				        _write(newfh,newtb[tmpj].name,8);
						_write(newfh,":\n",2);
				        for(tmpi=0;tmpi<readnum(newtb[tmpj].type);tmpi++)
						{
					        switch(readchar(newtb[tmpj].type))
							{
					           case 'A':
						          _read(fh,aa,1);
						          _write(newfh,aa,1);
					          	  break;
					           case 'D':
						          _read(fh,dd,8);
						          for(tmpk=0;tmpk<8;tmpk++)
					            		ddtmp[tmpk]=dd[7-tmpk];
						          ddtmp[8]='\0';
						          ddn=readd(ddtmp);
						          buffer3 = _ecvt(ddn, precision, &decimal, &sign );
                                  if(decimal>307||decimal<-307)
								  {
									  _write(newfh,"0.0000000\n",10);
								  }
								  else
								  {
								      if(sign!=0)
				                         _write(newfh,"-",1);
			                          buffer2[0]=buffer3[0];
			                          buffer2[1]='.';
			                          for(tmpk=2;tmpk<=10;tmpk++)
				                         buffer2[tmpk]=buffer3[tmpk-1];
                                      _write(newfh,buffer2,11);
			                          _write(newfh,"E",1);
			                          _itoa(decimal-1,buffer3,10);
								      if(decimal>=1)
				        	             _write(newfh,"+",1);
			                          _write(newfh,buffer3,getnlnth(decimal-1));
			                          _write(newfh,retn,1);
								  }
						          break;
					           case 'E':
						           _read(fh,ee,4);
						           for(tmpk=0;tmpk<4;tmpk++)
						            	eetmp[tmpk]=ee[3-tmpk];
						           eetmp[4]='\0';
						           een=reade(eetmp);
					               buffer3 = _ecvt(een, precision, &decimal, &sign );
						           if(decimal>37||decimal<-37)
								   {
									  _write(newfh,"0.0000000\n",10);
								   }
								   else
								   {
								       if(sign!=0)
				                          _write(newfh,"-",1);
			                           buffer2[0]=buffer3[0];
			                           buffer2[1]='.';
			                           for(tmpk=2;tmpk<=10;tmpk++)
				                          buffer2[tmpk]=buffer3[tmpk-1];
                                       _write(newfh,buffer2,11);
			                           _write(newfh,"E",1);
			                           _itoa(decimal-1,buffer3,10);
				                       if(decimal>=1)
					                      _write(newfh,"+",1);
			                           _write(newfh,buffer3,getnlnth(decimal-1));
			                           _write(newfh,retn,1);
								   }
					           	   break;
					           case 'J':
						           _read(fh,jj,4);
						           for(tmpk=0;tmpk<4;tmpk++)
							            jjtmp[tmpk]=jj[3-tmpk];
						           jjtmp[4]='\0';
						           jjn=readj(jjtmp);
					               ltoa(jjn, buffer, 10 );
                                   _write(newfh,buffer,strlen(buffer));
						           _write(newfh,retn,1);
						           break;
					           case 'I':
						           _read(fh,ii,2);
						           for(tmpk=0;tmpk<2;tmpk++)
							            iitmp[tmpk]=ii[1-tmpk];
						           iitmp[2]='\0';
						           iin=readi(iitmp);
						           itoa(jjn, buffer, 10 );
                                   _write(newfh,buffer,strlen(buffer));
						           _write(newfh,retn,1);
						           break;
							}
						}
						_write(newfh,"\n",1);
				  }
			}
			_close(newfh);
            _close(fh);
			exit(0);
		}
	}
}
	
		
		
					





#include "stdio.h"
#include "string.h"
#include "split.h"
#include <io.h>
#include <fcntl.h>
#include <stdlib.h>
void main()
{
	FILE *fp;
    int fh,partfh=-1,mark=0;
	long sof,curpos=0,line=0,fline=0;
	char tmp[16],tmp9[10],buffer[3],newfn[80]="",fname[80]="",fitsname[80]="";
	printf("input the filename:");
    gets(fitsname);
	fh = _open(fitsname, _O_RDONLY|_O_BINARY );
	sof=_filelength(fh);
	fline=sof/16;	
	while(line<fline)
	{
      _lseek(fh,curpos,SEEK_SET);
	  _read(fh,tmp,16);
	  strncpy(tmp9,tmp,9);
	  tmp9[9]='\0';
	  if(line==0&&strcmp(tmp9,"SIMPLE  =")!=0)
	  {
		  printf("it is not a FITS file");
		  exit(0);
	  }
	  if(strcmp(tmp9,"SIMPLE  =")==0||strcmp(tmp9,"XTENSION=")==0)
	  {
		  if(partfh!=-1)
			  _close(partfh);
		  mark++;
		  strcpy(newfn,"");
		  strcat(newfn,"file");
		  _itoa(mark,buffer,10);
		  strcat(newfn,buffer);
		  strcat(newfn,".dat");
      	  partfh=_open(newfn,_O_CREAT|_O_RDWR|_O_BINARY );
	  }
	  _write(partfh,tmp,16);  
	  line++;
	  curpos+=16;
	}
	_close(partfh);
    _close(fh);
	fp=fopen("index.dat","w+");
	fprintf(fp,"(flie1.dat) PRIMARY \n");
	for(fh=2;fh<=mark;fh++)
	{
		strcpy(newfn,"");
		strcat(newfn,"file");
		_itoa(fh,buffer,10);
		strcat(newfn,buffer);
		strcat(newfn,".dat");
		strcpy(fname,"");
		getname(newfn,fname);
		fprintf(fp,"(file%d.dat) XTENSION: %s DIMENSION: %d * %d\n",fh,fname,getfield(newfn),getnum(newfn));
	}
    fclose(fp);
}

猜你喜欢

转载自blog.csdn.net/b0207191/article/details/94123928