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 + -
显示快捷键?