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