zipgetstationdata_mex.c

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

C
256
字号
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <errno.h>#include <fcntl.h>#ifdef unix# include <unistd.h># include <utime.h>#else# include <direct.h># include <io.h>#endif//	#include "matlab.h"	#include "matrix.h"	#include "mex.h"#include "unzip.h"#define CASESENSITIVITY (1)#define WRITEBUFFERSIZE (8192)#define MIN(A,B) A<B?A:B
typedef struct SDoubleMtx{	double *Mtx;	int *Dim;	int Ndim;#ifdef MATLAB_MEX_FILE	mxArray *MatArray;#endif} SDoubleMtx;static unzFile uf;static char zipName[WRITEBUFFERSIZE];/* * WhichEndian.c  * returns 1 if Big Endian  ( MSB LSB ) * returns 0 if Little Endian ( LSB MSB ) */int WhichEndian(){  unsigned short i;    i=0x01;    return( ( (int) *(char *)(&i) == 0) );}/* * LittleEndian.c  * returns 0 if Big Endian  ( MSB LSB ) * returns 1 if Little Endian ( LSB MSB ) */int LittleEndian(){  return( WhichEndian() == 0 );}/* * BigEndian.c  * returns 1 if Big Endian  ( MSB LSB ) * returns 0 if Little Endian ( LSB MSB ) */int BigEndian(){  return( WhichEndian() );}void copyBytes(unsigned char *orig,unsigned char *dest,int nb,int swp){
	int j;
	if(swp){
		for(j=0;j<nb;j++) dest[nb-j-1]=orig[j];
	}else{
		for(j=0;j<nb;j++) dest[j]=orig[j];
	}
}
void swapBytes(unsigned char *orig,int nb,int N){
	int i,j,k,m;
	unsigned char dum;
	m=nb/2;
	for(i=0;i<N;i+=nb){
		k=i+nb-1;
		for(j=0;j<m;j++){
			dum=orig[i+j];
			orig[i+j]=orig[k-j];
			orig[k-j]=dum;
		}

	}
}
void mexFunction(int nlhs, mxArray  *plhs[], int nrhs, const mxArray *prhs[]) {	char *fin=NULL,*fout=NULL,*dir=NULL,*filename=NULL;	SDoubleMtx *MtxF;		int error=0;	int err = UNZ_OK;	char filename_inzip[WRITEBUFFERSIZE];	unz_file_info file_info;	size_t size_buf = 0;	int N;	unsigned char *buf,*buf1;	int i,nbr,nbl,nb,j,NUMDIAS,n;	int SWAPFILES;	
	int BINFILE=1;	short *sDum;	float *fDum;	int *iDum;	unsigned char Dum[8];		sDum=(short *)Dum;	fDum=(float *)Dum;	iDum=(int *)Dum;	if(nrhs<2)		mexErrMsgTxt("You need 2 inputs.\n.");	if (!(mxIsChar(prhs[0]))){		mexErrMsgTxt("Input 1 must be of type string.\n.");    }    dir=mxArrayToString(prhs[0]);		if (!(mxIsChar(prhs[1]))){		mexErrMsgTxt("Input 2 must be of type string.\n.");    }    filename=mxArrayToString(prhs[1]);	MtxF=(SDoubleMtx *)mxMalloc(sizeof(SDoubleMtx));	MtxF->Ndim=2;	MtxF->Dim=(int *)mxMalloc(sizeof(int)*MtxF->Ndim);	MtxF->Dim[0]=0;MtxF->Dim[1]=0;
	
	for(i=0;i<nlhs;i++)
		plhs[i]=mxCreateNumericArray(MtxF->Ndim,MtxF->Dim,mxDOUBLE_CLASS,mxREAL);
	if(strcmp(dir,zipName)!=0){	//	printf("%s,%s\n",dir,zipName);		unzClose(uf);		uf = unzOpen(dir);		strcpy(zipName,dir);	}	    if (unzLocateFile(uf,filename,1)!=UNZ_OK)    {        //printf("file %s not found in the zipfile (%s)\n",filename,dir);		error=1;
		return;	}	err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);	if (err!=UNZ_OK)	{		//printf("error %d with zipfile (%s) in unzGetCurrentFileInfoe\n",err,dir);		error=1;
		return;	}	err = unzOpenCurrentFile(uf);	if (err!=UNZ_OK)	{		//printf("error %d with zipfile (%s) in unzOpenCurrentFile\n",err,dir);		error=1;
		return;	}	
	size_buf=file_info.uncompressed_size;
	buf=(unsigned char *)mxMalloc(sizeof(unsigned char)*size_buf);
	//printf("[%d]>[%d] %s\n",file_info.uncompressed_size,file_info.compressed_size,filename_inzip);	
	nbr = unzReadCurrentFile(uf,buf,size_buf);
	
	if(nbr<(size_buf)){
		printf("Error Reading Data [size_buf=%d]:[nbr=%d]",size_buf,nbr);
		return;
	}
	
	N=0;
	for(i=N;i<size_buf;i++){
		if(buf[i]=='\n') break;
	}
	buf[i]='\0';
	//printf("%s\n",&buf[N]);
	plhs[0]=mxCreateString(&buf[N]);
	N=i+1;
	if(nlhs<2){	
		if(buf!=NULL)
			mxFree(buf);
	 return;
	}
	
	for(i=N;i<size_buf;i++){
		if(buf[i]=='\n') break;
	}
	buf[i]='\0';
	//printf("%s\n",&buf[N]);
	plhs[1]=mxCreateString(&buf[N]);
	N=i+1;
	if(nlhs<3){	
		if(buf!=NULL)
			mxFree(buf);
	 return;
	}
	
	
	if(BINFILE){

		SWAPFILES=LittleEndian();

		nb=sizeof(float);
		NUMDIAS=(nbr-N)/nb;
		//printf("(%d-%d)/%d=%d\n",nbr,N,nb,NUMDIAS);
	/*
		if(SWAPFILES)
			swapBytes(buf,nb,NUMDIAS);
	*/		MtxF->Dim[0]=NUMDIAS;MtxF->Dim[1]=1;
		plhs[2]=mxCreateNumericArray(MtxF->Ndim,MtxF->Dim,mxDOUBLE_CLASS,mxREAL);
		MtxF->Mtx=mxGetPr(plhs[2]);
		

		n=0;
		for(i=N;i<nbr;i+=nb){
			copyBytes(&buf[i],Dum,nb,SWAPFILES);
			MtxF->Mtx[n]=((double)fDum[0]);
			n++;
		}
	}else{
	/*	psize=1024;
		n=0;
		p=(double *)mxMalloc(sizeof(double)*pSize);
		for(i=0;;i+=nb){
			sscanf(&buf[N],"%g\n",&fDum[0]);
			if(n>=psize){
				psize+=1024;
				p=(double *)mxRealloc(p,sizeof(double)*pSize);
			}
			p[n]=fDum[0];
			n++;
		}
	*/
	}

	if(buf!=NULL)
		mxFree(buf);
	

}

⌨️ 快捷键说明

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