⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbcreadmifdata.cpp

📁 读取MapInfo的交换格式的MifMid文件
💻 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 + -