buildindex.c

来自「麻省理工学院的人工智能工具箱,很珍贵,希望对大家有用!」· C语言 代码 · 共 240 行

C
240
字号
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <time.h>#include "gribfuncs.h"#include "proutils.h"int debug=1;static char **IdxFace=NULL;static long FaceLength=0;static long IdxSize=0;static long FaceCMP=25;
#define VERBOSE 1
int grbseek (char *,FILE **, long *, int,GRIB_HDR *, char *);int grib_dec_heads (char *, PDS_INPUT  *, grid_desc_sec  *,        	BDS_HEAD_INPUT *, BMS_INPUT *,char *);typedef struct Index_member{	unsigned short Year;	unsigned char  Month;	unsigned char  Day;	unsigned char  Hour;	unsigned short Fore;	unsigned char  Parm;	unsigned char  Subparm;	unsigned short Height;	unsigned short File;	unsigned long  Pos;} Index_member;int compare( const char **arg1, const char **arg2 ){	return strncmp(arg1[0],arg2[0],FaceCMP);}int makeIndex(char *Dir,char *NameIn);SDoubleMtx *buildIndex(char *cmd,char *Dir,char *NameIn,char *NameOut) {	FILE *ftxt;	fpos_t fs;	Index_member idx[1];int k=0;char dum1[512],DataFile[512],DirData[512];	int d[]={1,2};	long NM;	SDoubleMtx *MtxF=NULL;	char DumMess[512],*mess,**messFound;	if(Dir[strlen(Dir)-1]!='/' | Dir[strlen(Dir)-1]!='\\'){		sprintf(DirData,"%s/",Dir);	}else{		sprintf(DirData,"%s",Dir);	}		sprintf(DumMess,"%04d%02d%02d%02d%04d_%03d%03d%04d_%04d%010d\n",idx[k].Year=0,idx[k].Month=0,idx[k].Day=0,idx[k].Hour=0,idx[k].Fore=0,idx[k].Parm=0,idx[k].Subparm=0,idx[k].Height=0,idx[k].File=0,idx[k].Pos=0);	FaceLength=strlen(DumMess)+1;	//printf("Starting...\n");	if(strstr(cmd,"make")){		if(IdxFace) free(IdxFace);		//printf("Making: %s %s\n",Dir,NameIn);		IdxFace=NULL;		IdxSize=0;		makeIndex(Dir,NameIn);	}	if(strstr(cmd,"sort")){		qsort(IdxFace,(size_t)IdxSize,sizeof(char *),compare);	}		if(strstr(cmd,"write")){		sprintf(DataFile,"%s%s",DirData,NameOut);		if(!(ftxt=fopen(DataFile,"wb"))){sprintf(dum1,"Invalid Output File %s",DataFile);errMsgTxt(dum1);}		for (k=0;k<IdxSize;k++)			fwrite( IdxFace[k], sizeof(char)*FaceLength-1,1, ftxt );		if (ftxt) fclose(ftxt);	}		if(strstr(cmd,"read")){		sprintf(DataFile,"%s%s",DirData,NameOut);		if(!(ftxt=fopen(DataFile,"rb"))){sprintf(dum1,"Invalid Index File %s",DataFile);errMsgTxt(dum1);}		if(IdxFace) free(IdxFace);		IdxFace=NULL;		IdxSize=0;		fseek(ftxt,0,SEEK_END);		fgetpos(ftxt,&fs);		IdxSize=((long)fs)/(FaceLength-1);		fseek(ftxt,0,SEEK_SET);		printf("FileSize=%d FaceLength=%d IdxSize=%d\n",(long)fs,FaceLength,IdxSize);		IdxFace=(char**)malloc(sizeof(char *)*IdxSize);		IdxFace[0]=(char *)malloc(sizeof(char)*FaceLength*IdxSize);		for (k=0;k<IdxSize;k++){			IdxFace[k]=&IdxFace[0][FaceLength*k];			fgets(IdxFace[k],FaceLength,ftxt);		}		if (ftxt) fclose(ftxt);		}    if(strstr(cmd,"find")){		//printf("%s %s\n",NameIn,Dir);		NM=strtol(NameIn,&mess,10);		d[0]=NM;		MtxF=newDoubleMtx(2,d);			    //printf("NM=%d\n",NM);		mess=strtok(Dir,",");		//printf("mess=%s\n",mess);		for(k=0;k<NM;k++){			if(mess==NULL){sprintf(dum1,"A problem with FIND\n");errMsgTxt(dum1);}			messFound=bsearch(&mess,IdxFace,(size_t)IdxSize,sizeof(char *),compare);							if(messFound==NULL){				MtxF->Mtx[k]=0;					MtxF->Mtx[k+NM]=0;				}else{				strncpy(dum1,messFound[0]+26,4);				dum1[4]='\0';				MtxF->Mtx[k]=atof(dum1);					strncpy(dum1,messFound[0]+30,10);				dum1[10]='\0';				MtxF->Mtx[k+NM]=atof(dum1);				}			//printf(messFound[0]);			mess=strtok(NULL,",");		}	}			return MtxF;}int makeIndex(char *Dir,char *NameIn){	FILE *fin,*fp;	char errmsg[2000],ndat[512],dum1[512];	char DataFile[1024],DirData[512];	short numfil;	int nReturn=0,Rd_Indexfile=0,k,status;	long offset,NM=0,iM=0;	Index_member *idx=NULL;		BMS_INPUT bms;	PDS_INPUT pds;	grid_desc_sec gds;	BDS_HEAD_INPUT bds_head;	GRIB_HDR *gh1;		errmsg[0]='\0';	offset=0;	fp=(FILE *)NULL;		if(nReturn = init_gribhdr(&gh1,errmsg)){sprintf(dum1,"%s",errmsg);errMsgTxt(dum1);}	if(Dir[strlen(Dir)-1]!='/' | Dir[strlen(Dir)-1]!='\\'){		sprintf(DirData,"%s/",Dir);	}else{		sprintf(DirData,"%s",Dir);	}		sprintf(DataFile,"%s%s",DirData,NameIn);	if(!(fin=fopen(DataFile,"rb"))){		sprintf(dum1,"Invalid Input File %s",DataFile);		errMsgTxt(dum1);	}			status=fscanf(fin,"%s",ndat);	//printf("Processing: %s (%d)\n",ndat,status);	numfil=0;	while(status>0)	{		numfil++;		gh1->msg_length=0L;		sprintf(DataFile,"%s%s",DirData,ndat);				//printf("Processing: %s\n",DataFile);			if(!(fp=fopen(DataFile,"rb"))){sprintf(dum1,"Invalid File %s",ndat);errMsgTxt(dum1);}		for(offset = 0L;nReturn==0;offset += gh1->msg_length){			if(nReturn=grbseek(ndat,&fp,&offset,Rd_Indexfile,gh1,errmsg))			{				if(nReturn == 2) break;				sprintf(dum1,"Grib_seek returned non zero stat (%d)\n\terrmsg: %s",nReturn,errmsg);				errMsgTxt(dum1);			}			if (errmsg[0] != '\0')			{				printf("%s; Skip message...\n",errmsg);				errmsg[0]='\0';				gh1->msg_length=1L;				continue;						}			if (gh1->msg_length<0)			{				sprintf(dum1,"Error: message returned has bad length (%ld)\n",gh1->msg_length);errMsgTxt(dum1);			}			else if (gh1->msg_length == 0)			{				printf("msg_length is Zero, set offset to 1\n");				gh1->msg_length=1L;				continue ;			}			init_dec_struct(&pds,&gds,&bms,&bds_head);				if(nReturn=grib_dec_heads((char *)gh1->entire_msg,&pds,&gds,&bds_head,&bms,errmsg))			{				sprintf(dum1,"grib_dec returned non zero stat (%d)\n\terrmsg: %s\n\t%d,%s",nReturn,errmsg,offset,DataFile);				errMsgTxt(dum1);			}			if (iM>=NM){				NM+=1000;				idx=(Index_member *)realloc(idx,sizeof(Index_member)*NM);			}			if(pds.usHeight1<10000){				idx[iM].Year=(unsigned short)((pds.usCentury-1)*100+pds.usYear);				idx[iM].Month=(unsigned char)pds.usMonth;				idx[iM].Day=(unsigned char)pds.usDay;				idx[iM].Hour=(unsigned char)pds.usHour;				idx[iM].Fore=(unsigned short)pds.usTime_range==10?pds.usP1*256+pds.usP2:pds.usP1;				idx[iM].Parm=(unsigned char)pds.usParm_id;				idx[iM].Subparm=(unsigned char)pds.usParm_sub;				idx[iM].Height=(unsigned short)pds.usHeight1;				idx[iM].File=(unsigned short)numfil;				idx[iM].Pos=(unsigned long)offset;				iM++;			}		}		ndat[0]='\0';		status=fscanf(fin,"%s",ndat);		nReturn=0;		gh1->msg_length=0;		offset=0;		if (fp) fclose(fp);     	fp=(FILE*)NULL;	}		IdxSize=iM;	IdxFace=(char**)malloc(sizeof(char *)*IdxSize);	IdxFace[0]=(char *)malloc(sizeof(char)*FaceLength*IdxSize);	for (k=0;k<IdxSize;k++){		IdxFace[k]=&IdxFace[0][FaceLength*k];		sprintf(IdxFace[k],"%04d%02d%02d%02d%04d_%03d%03d%04d_%04d%010d\n",idx[k].Year,idx[k].Month,idx[k].Day,idx[k].Hour,idx[k].Fore,idx[k].Parm,idx[k].Subparm,idx[k].Height,idx[k].File,idx[k].Pos);		//fprintf(ftxt,"%s",IdxFace[k]);	}	if (idx) free(idx);	printf("%d messages decoded\n",IdxSize);	}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?