📄 dbcreadmifdata.cpp
字号:
// DBCReadMifData.cpp: implementation of the DBCReadMifData class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "DBCReadMifData.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
DBCReadMifData::DBCReadMifData()
{
m_iHeaderDataLen=0;
m_strDataFileName = NULL;
m_pfile = NULL;
memset(&m_FileHeader,0,sizeof(FileHeader));
}
DBCReadMifData::~DBCReadMifData()
{
if(m_strDataFileName!=NULL)
delete[] m_strDataFileName;
if(m_pfile!=NULL)
{
fclose(m_pfile);
m_pfile=NULL;
}
}
DBCReadMifData::DBCReadMifData(char* chFileName)
{
m_strDataFileName = new char[MAX_FILE_NAME];
memcpy(m_strDataFileName,chFileName,MAX_FILE_NAME);
memset(&m_FileHeader,0,sizeof(FileHeader));
m_pfile = NULL;
m_iHeaderDataLen=0;
}
bool DBCReadMifData::Init()
{
if(m_strDataFileName==NULL)
return false;
if(m_pfile==NULL)
{
if((m_pfile=fopen(m_strDataFileName,"r"))==NULL)
return false ;
}
ReadFileHeader();
return true ;
}
#define STREAMLEN 100
bool DBCReadMifData::ReadFileHeader()
{
if(m_pfile==NULL)
return false;
char chTmp[STREAMLEN]={0,};
char DataType=0;
fread(chTmp,4,1,m_pfile);
while(strcmp(chTmp,"Data")!=0)
{
chTmp[0]=chTmp[1];
chTmp[1]=chTmp[2];
chTmp[2]=chTmp[3];
fread(&chTmp[3],1,1,m_pfile);
}
m_iHeaderDataLen=ftell(m_pfile)-4;
char *chData = new char[m_iHeaderDataLen+4];
memset(chData,0,m_iHeaderDataLen+4);
fseek(m_pfile,0,0);
fread(chData,m_iHeaderDataLen,1,m_pfile);
int iPosKeyWord[8];
int iLenKeyWord[7]={7,7,9,6,5,8,7};
iPosKeyWord[7]=m_iHeaderDataLen;
strcpy(chTmp,"Version");
iPosKeyWord[0]=findPosInCstring(chData,m_iHeaderDataLen,chTmp,7);
strcpy(chTmp,"Charset");
iPosKeyWord[1]=findPosInCstring(chData,m_iHeaderDataLen,chTmp,7);
strcpy(chTmp,"Delimiter");
iPosKeyWord[2]=findPosInCstring(chData,m_iHeaderDataLen,chTmp,9);
strcpy(chTmp,"Unique");
iPosKeyWord[3]=findPosInCstring(chData,m_iHeaderDataLen,chTmp,6);
strcpy(chTmp,"Index");
iPosKeyWord[4]=findPosInCstring(chData,m_iHeaderDataLen,chTmp,5);
strcpy(chTmp,"CoordSys");
iPosKeyWord[5]=findPosInCstring(chData,m_iHeaderDataLen,chTmp,8);
strcpy(chTmp,"Columns");
iPosKeyWord[6]=findPosInCstring(chData,m_iHeaderDataLen,chTmp,7);
int iPos;
for(int iLoop=0;iLoop<7;iLoop++)
{
if(iPosKeyWord[iLoop]>=0)
{
for(int iLoop1=iLoop+1;iLoop1<8;iLoop1++)
if(iPosKeyWord[iLoop1]>=0)
break;
if(iLoop1<8)
{
switch(iLoop)
{
case 0: //Version
{
iPos = iPosKeyWord[iLoop]+iLenKeyWord[iLoop];
memset(chTmp,0,STREAMLEN);
memcpy(chTmp,&chData[iPos],iPosKeyWord[iLoop1]-iPos);
m_FileHeader.MapInfoVersion=atoi(chTmp);
break;
}
case 1: //Charset
{
iPos = iPosKeyWord[iLoop]+iLenKeyWord[iLoop];
m_FileHeader.strDataCharSet=new char[iPosKeyWord[iLoop1]-iPos];
memcpy(m_FileHeader.strDataCharSet,&chData[iPos],iPosKeyWord[iLoop1]-iPos);
break;
}
case 2: //Delimiter
{
iPos = iPosKeyWord[iLoop]+iLenKeyWord[iLoop];
memset(chTmp,0,STREAMLEN);
memcpy(chTmp,&chData[iPos],iPosKeyWord[iLoop1]-iPos);
m_FileHeader.strDataDelimiter=new char[iPosKeyWord[iLoop1]-iPos];
char chTmp1[2]="\"";
int iPosTmp=findPosInCstring(chTmp,iPosKeyWord[iLoop1]-iPos,chTmp1,1);
strcpy(m_FileHeader.strDataDelimiter,&chTmp[iPosTmp+1]);
int iPosTmp1=findPosInCstring(m_FileHeader.strDataDelimiter,iPosKeyWord[iLoop1]-iPos-iPosTmp-1,chTmp1,1);
if(iPosTmp1>=0)
m_FileHeader.strDataDelimiter[iPosTmp1]=0;
break;
}
case 3: //Unique
{
break;
}
case 4: //Index
{
break;
}
case 5: //CoordSys
{
iPos = iPosKeyWord[iLoop]+iLenKeyWord[iLoop];
m_FileHeader.strCoordSys=new char[iPosKeyWord[iLoop1]-iPos];
memcpy(m_FileHeader.strCoordSys,&chData[iPos],iPosKeyWord[iLoop1]-iPos);
break;
}
case 6: //Columns
{
iPos = iPosKeyWord[iLoop]+iLenKeyWord[iLoop];
memset(chTmp,0,STREAMLEN);
sscanf(&chData[iPos],"%s",chTmp);
int iLenChar=strlen(chTmp) ;
m_FileHeader.Columns.uiColumnCount=atoi(chTmp);
m_FileHeader.Columns.pRec_Columns=new Column[m_FileHeader.Columns.uiColumnCount];
for(int iLoop2=0;iLoop2<m_FileHeader.Columns.uiColumnCount;iLoop2++)
{
int iPosTmp=findPosInCstring(&chData[iPos],iPosKeyWord[iLoop1]-iPos,chTmp,iLenChar);
iPos+=(iPosTmp+iLenChar);
memset(chTmp,0,STREAMLEN);
sscanf(&chData[iPos],"%s",chTmp);
iLenChar=strlen(chTmp) ;
if(iLenChar>50)
return false;
strcpy(m_FileHeader.Columns.pRec_Columns[iLoop2].chColumnName,chTmp);
iPosTmp=findPosInCstring(&chData[iPos],iPosKeyWord[iLoop1]-iPos,chTmp,iLenChar);
iPos+=(iPosTmp+iLenChar);
memset(chTmp,0,STREAMLEN);
sscanf(&chData[iPos],"%s",chTmp);
iLenChar=strlen(chTmp) ;
char chTmp1[20]="(";
iPosTmp=findPosInCstring(chTmp,iLenChar,chTmp1,1);
if(iPosTmp<0)
{
if(strcmp(chTmp,"integer")==0
||strcmp(chTmp,"Integer")==0
||strcmp(chTmp,"INTEGER")==0)
{
m_FileHeader.Columns.pRec_Columns[iLoop2].uiColumnType=3;
m_FileHeader.Columns.pRec_Columns[iLoop2].uiLength=4;
}
else if(strcmp(chTmp,"smallint")==0
||strcmp(chTmp,"Smallint")==0
||strcmp(chTmp,"SMALLINT")==0)
{
m_FileHeader.Columns.pRec_Columns[iLoop2].uiColumnType=2;
m_FileHeader.Columns.pRec_Columns[iLoop2].uiLength=2;
}
else if(strcmp(chTmp,"float")==0
||strcmp(chTmp,"Float")==0
||strcmp(chTmp,"FLOAT")==0)
{
m_FileHeader.Columns.pRec_Columns[iLoop2].uiColumnType=4;
m_FileHeader.Columns.pRec_Columns[iLoop2].uiLength=4;
}
else if(strcmp(chTmp,"date")==0
||strcmp(chTmp,"Date")==0
||strcmp(chTmp,"DATE")==0)
{
m_FileHeader.Columns.pRec_Columns[iLoop2].uiColumnType=5;
m_FileHeader.Columns.pRec_Columns[iLoop2].uiLength=20;
}
else if(strcmp(chTmp,"logical")==0
||strcmp(chTmp,"Logical")==0
||strcmp(chTmp,"LOGICAL")==0)
{
m_FileHeader.Columns.pRec_Columns[iLoop2].uiColumnType=6;
m_FileHeader.Columns.pRec_Columns[iLoop2].uiLength=1;
}
else return false;
}
else
{
memcpy(chTmp1,chTmp,iPosTmp);
if(strcmp(chTmp1,"Char")==0
||strcmp(chTmp1,"char")==0
||strcmp(chTmp1,"CHAR")==0)
{
m_FileHeader.Columns.pRec_Columns[iLoop2].uiColumnType=1;
m_FileHeader.Columns.pRec_Columns[iLoop2].uiLength=atoi(&chTmp[iPosTmp+1]);
}
else if(strcmp(chTmp1,"decimal")==0
||strcmp(chTmp1,"Decimal")==0
||strcmp(chTmp1,"DECIMAL")==0)
{
m_FileHeader.Columns.pRec_Columns[iLoop2].uiColumnType=7;
strcpy(chTmp1,",");
int iPosDecimal = findPosInCstring(&chTmp[iPosTmp+1],iLenChar-iPosTmp-1,chTmp1,1);
m_FileHeader.Columns.pRec_Columns[iLoop2].uiLength
=((atoi(&chTmp[iPosTmp+1]))<<8)+(atoi(&chTmp[iPosTmp+iPosDecimal+2]));
}
else return false;
}
}
break;
}
default:
break;
}
}
iLoop=iLoop1-1;
}
}
delete []chData;
return true;
}
int DBCReadMifData::findPosInCstring(char* pstrData,int iLen,char* pDataSegment,int iLenSegment)
{
for(int iLoop=0;iLoop<=iLen-iLenSegment;iLoop++)
{
for(int iLoop1=0;iLoop1<iLenSegment;iLoop1++)
if(pDataSegment[iLoop1]!=pstrData[iLoop+iLoop1])
break;
if(iLoop1==iLenSegment)
break;
}
if(iLoop==iLen-iLenSegment+1)
return -1;
else return iLoop;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -