📄 makejianpinindexdlg.cpp
字号:
iOffset = 0;
memset(pJPData, 0x0, cdwCapacity);
memset(pNameData, 0x0, cdwCapacity);
pJPCur = pJPData;
pNameCur = pNameData;
}
delete[] pJPData;
pJPData = NULL;
delete[] pNameData;
pNameData = NULL;
}
fileJP.Seek(iCharIdxPos, CFile::begin);
fileJP.Write(&st_CharIdx, sizeof(ST_CharIndex));
iCharIdxPos += sizeof(ST_CharIndex);
iPackNum += st_CharIdx.usPackNum;
}
return iPackNum;
}
/*************************************** Class City ***************************************/
//GBK
int GetJianPinCode(LPCSTR lpSource, int nSourceLen, LPSTR lpObject, int &nObjectLen, BOOL bUpperChar)
{
return GetMulHZJP(lpSource, nSourceLen, lpObject, nObjectLen);
}
int GetPYIndex(const char chPY)
{
int nIndex = 0;
// if (chPY == (char)0x0)
// nIndex = -1;
if (chPY >= '0' && chPY <= '9')
// nIndex = 0;
nIndex = g_szCharMappingNumber[chPY - '0'] - 'a' + 1;
else if (chPY >= 'a' && chPY <= 'z')
nIndex = chPY - 'a' + 1;
else
nIndex = -1;
ASSERT(nIndex < CHARACTER_NEWINDEX_COUNT);
return nIndex;
}
void MergeToFinalFile (CString strSDIFile)
{
UINT unReadContent = 0;
BYTE pBuffer[BLOCK_SIZE]; // 1K
// (1) Header
CFile finalFile(strSDIFile, CFile::modeCreate | CFile::modeReadWrite);
CFile tempFile(strSDIFile + "Header", CFile::modeRead);
while (unReadContent = tempFile.Read(pBuffer, BLOCK_SIZE))
{
finalFile.Write(pBuffer, unReadContent);
if (unReadContent < BLOCK_SIZE)
break;
}
tempFile.Close();
// (2) 城市简拼索引数据
tempFile.Open(strSDIFile + "Data", CFile::modeRead);
while (unReadContent = tempFile.Read(pBuffer, BLOCK_SIZE))
{
finalFile.Write(pBuffer, unReadContent);
if (unReadContent < BLOCK_SIZE)
break;
}
tempFile.Close();
finalFile.Close();
remove(strSDIFile + "Header");
remove(strSDIFile + "Data");
}
void CMakeJianPinIndexDlg::OnBtnCheckJp()
{
// TODO: Add your control notification handler code here
// 检查上海的数据,上海城市ID:= 0x4BAF0
UpdateData(true);
if(_access(m_strJianPinFile.GetBuffer(0), 4) != 0 || m_strJPName.IsEmpty())
{
AfxMessageBox("参数设置不正确!");
return;
}
int nCityNum = -1;
CCity city;
CFile fileJP;
fileJP.Open(m_strJianPinFile, CFile::modeRead);
fileJP.Seek(CJPIndexStruct::FileHeaderFlagLen, CFile::begin);
fileJP.Read(&nCityNum, sizeof(nCityNum));
for (int nCityCount = 0; nCityCount < nCityNum; ++nCityCount)
{
fileJP.Read(&city, CJPIndexStruct::CityIndexNewLen);
if (city.GetID() == 0x4BAF0)/*只是简单测试一下,这里写死为上海城市ID*/
break;
}
// 上海的数据
uLongf ulUCLen = city.GetUCLen();
ulongf ulCLen = city.GetCLen();
BYTE *pbCAddr = new BYTE[ulCLen];
BYTE *pbUCAddr = new BYTE[ulUCLen];
ASSERT(pbCAddr != NULL);
ASSERT(pbUCAddr != NULL);
fileJP.Seek(city.GetOffset(), CFile::begin);
ASSERT(fileJP.Read(pbCAddr, ulCLen) == ulCLen);
if (uncompress(pbUCAddr, &ulUCLen, pbCAddr, ulCLen) != Z_OK)
{
AfxMessageBox("uncompress error!");
return;
}
delete []pbCAddr;
// 银行
int *pPIJPIndexLen = (int*)((BYTE*)&city + 0x10);
int *pRdJPIndexLen = (int*)((BYTE*)&city + 0x14);
BYTE *pbTemp = pbUCAddr;
BYTE *pbNIStart = pbUCAddr + *pPIJPIndexLen + *pRdJPIndexLen;
int nOffset = 0;
int nTarget = 0xFFFFFFFF;
int nJPLen = 0;
char *pszName = NULL;
CList <char*, char*>container;
for (; (pbTemp - pbUCAddr) < *pPIJPIndexLen;)
{
memcpy(&nOffset, pbTemp, sizeof(nOffset));
pbTemp += sizeof(nOffset);
nJPLen = strlen((char*)pbTemp);
if (strstr((char*)pbTemp, m_strJPName.GetBuffer(0)) != NULL)
{
BYTE *pbName = pbNIStart + nOffset;
int nNameLen = -1;
memcpy(&nNameLen, pbName, sizeof(nNameLen));
pbName += sizeof(nNameLen);
pszName = new char[nNameLen + 1];
memset(pszName, 0x0, nNameLen + 1);
memcpy(pszName, pbName, nNameLen);
if (nOffset != nTarget)
{
container.AddTail(pszName);
nTarget = nOffset;
}
}
pbTemp += (nJPLen + 1);
}
for (; (pbTemp - pbUCAddr) < (*pPIJPIndexLen + *pRdJPIndexLen);)
{
memcpy(&nOffset, pbTemp, sizeof(nOffset));
pbTemp += sizeof(nOffset);
nJPLen = strlen((char*)pbTemp);
if (strstr((char*)pbTemp, m_strJPName.GetBuffer(0)) != NULL)
{
BYTE *pbName = pbNIStart + nOffset;
int nNameLen = -1;
memcpy(&nNameLen, pbName, sizeof(nNameLen));
pbName += sizeof(nNameLen);
pszName = new char[nNameLen + 1];
memset(pszName, 0x0, nNameLen + 1);
memcpy(pszName, pbName, nNameLen);
if (nOffset != nTarget)
{
container.AddTail(pszName);
nTarget = nOffset;
}
}
pbTemp += (nJPLen + 1);
}
POSITION pos = container.GetHeadPosition();
CFile fileName;
fileName.Open("..\\name.txt", CFile::modeCreate | CFile::modeReadWrite);
USHORT usEnter = 0x0A0D;
for (int i = 0; i < container.GetCount(); ++i)
{
pszName = container.GetNext(pos);
fileName.Write(pszName, strlen(pszName));
fileName.Write(&usEnter, sizeof(usEnter));
if (pszName != NULL)
delete []pszName;
}
fileName.Close();
fileJP.Close();
delete []pbUCAddr;
pbUCAddr = NULL;
CString str("索引测试结果保存在: ");
str += fileName.GetFilePath();
AfxMessageBox(str);
}
void CMakeJianPinIndexDlg::ParseCityIDName()
{
// 提取CityID和CityName
FILE* fpCityAll = fopen(m_strCityAll, "r");
ST_CityAll st_CityAll;
memset(&st_CityAll, 0x0, sizeof(st_CityAll));
char cpBuff[64] = {0,};
LPSTR strKey[2];
while(fgets(cpBuff, 64, fpCityAll))
{
memset(strKey, 0, sizeof(strKey));
int no = fast_trim(cpBuff, ',', strKey, 20);
ASSERT(no == 2);
strcpy(st_CityAll.szName, strKey[0]);
st_CityAll.iCityID = atoi(strKey[1]);
m_vSTCityAll.push_back(st_CityAll);
memset(&st_CityAll, 0x0, sizeof(st_CityAll));
}
sort(m_vSTCityAll.begin(), m_vSTCityAll.end(), lessID);
fclose(fpCityAll);
}
// 提取城市ID
void CMakeJianPinIndexDlg::ReadTxt()
{
CString strPIDir(m_strTxtDir + "\\POITxt");
CString strRdDir(m_strTxtDir + "\\RdTxt");
struct _finddata_t tFileInfo;
char cpPattern[256] = {0, };
long lHandle = 0;
int iRet = 0;
int iPos = -1;
int iDist = 0;
CString strTmp;
std::vector<int> vPI;
std::vector<int> vRd;
//-----------------------------
// 遍历目录下的所有txt
for(int i = 0; i < 2; i++)
{
memset(cpPattern, 0x0, 256);
if(0 == i)
strcpy(cpPattern, strPIDir);
else
strcpy(cpPattern, strRdDir);
strcat(cpPattern, "\\*.txt");
lHandle = _findfirst (cpPattern, &tFileInfo);
if (lHandle == -1)
continue;
while ( !iRet )
{
strTmp = tFileInfo.name;
iPos = strTmp.Find(".txt");
if (iPos > 0)
{
iDist = atoi(strTmp.Left(iPos));
if(0 == i)
vPI.push_back(iDist);
else
vRd.push_back(iDist);
}
iRet = _findnext (lHandle, &tFileInfo);
}
}
sort(vPI.begin(), vPI.end());
sort(vRd.begin(), vRd.end());
//-----------------------------
// 提取城市列表
std::vector<int>::iterator iter_PI, iter_Rd;
iter_PI = vPI.begin();
iter_Rd = vRd.begin();
while(iter_PI != vPI.end() && iter_Rd != vRd.end())
{
if(*iter_PI == *iter_Rd)
{
m_vCity.push_back(*iter_PI);
iter_PI++;
iter_Rd++;
}
else if(*iter_PI > *iter_Rd)
{
m_vCity.push_back(*iter_Rd);
iter_Rd++;
}
else
{
m_vCity.push_back(*iter_PI);
iter_PI++;
}
}
while(iter_PI != vPI.end())
{
m_vCity.push_back(*iter_PI);
iter_PI++;
}
while(iter_Rd != vRd.end())
{
m_vCity.push_back(*iter_Rd);
iter_Rd++;
}
}
void CMakeJianPinIndexDlg::ParseCity()
{
int iProvID, iCityID, iSubCityID;
ST_ProvList* pProvList = NULL;
ST_CityList* pCityList = NULL;
POSITION pos_prov, pos_city;
for(int i = 0; i < m_vCity.size(); i++)
{
BOOL bFind = false;
iSubCityID = m_vCity[i];
iProvID = iSubCityID / 10000 * 10000;
if(iSubCityID / 10000 == 11 || iSubCityID / 10000 == 12 || iSubCityID / 10000 == 31 || iSubCityID / 10000 == 50)
iCityID = iProvID;
else
iCityID = iSubCityID / 100 * 100;
pos_prov = m_ProvList.GetHeadPosition();
while(pos_prov)
{
pProvList = m_ProvList.GetNext(pos_prov);
if(pProvList->iProvID == iProvID)
{
pos_city = pProvList->CityList.GetHeadPosition();
while(pos_city)
{
pCityList = pProvList->CityList.GetNext(pos_city);
if(pCityList->iCityID == iCityID)
{
pCityList->vSubCityList.push_back(iSubCityID);
bFind = true;
break;
}
}
if(!bFind)
{
pCityList = new ST_CityList;
pCityList->iCityID = iCityID;
pCityList->vSubCityList.push_back(iSubCityID);
pProvList->CityList.AddTail(pCityList);
bFind = true;
}
break;
}
}
if(!bFind)
{
pProvList = new ST_ProvList;
pCityList = new ST_CityList;
pCityList->iCityID = iCityID;
pCityList->vSubCityList.push_back(iSubCityID);
pProvList->iProvID = iProvID;
pProvList->CityList.AddTail(pCityList);
m_ProvList.AddTail(pProvList);
bFind = true;
}
}
}
void CMakeJianPinIndexDlg::StatCity()
{
m_iProvCnt = m_ProvList.GetCount();
m_iCityCnt = 0;
m_iSubCityCnt = 0;
ST_ProvList* pProvList = NULL;
ST_CityList* pCityList = NULL;
POSITION pos_prov = m_ProvList.GetHeadPosition();
while(pos_prov)
{
pProvList = m_ProvList.GetNext(pos_prov);
m_iCityCnt += pProvList->CityList.GetCount();
POSITION pos_city = pProvList->CityList.GetHeadPosition();
while(pos_city)
{
pCityList = pProvList->CityList.GetNext(pos_city);
m_iSubCityCnt += pCityList->vSubCityList.size();
}
}
TRACE3("%d, %d, %d\n", m_iProvCnt, m_iCityCnt, m_iSubCityCnt);
ASSERT(m_vCity.size() == m_iSubCityCnt);
}
void CMakeJianPinIndexDlg::Stat()
{
UpdateData(true);
if(_access(m_strJianPinFile.GetBuffer(0), 4) != 0)
{
AfxMessageBox("The NIN file doesn't exist!");
return;
}
int nCityNum = -1;
CCity city;
CFile fileJP;
fileJP.Open(m_strJianPinFile, CFile::modeRead);
fileJP.Seek(CJPIndexStruct::FileHeaderFlagLen, CFile::begin);
fileJP.Read(&nCityNum, sizeof(nCityNum));
for (int nCityCount = 0; nCityCount < nCityNum; ++nCityCount)
{
fileJP.Read(&city, CJPIndexStruct::CityIndexNewLen);
if (city.GetID() == 0x4BAF0)
break;
}
// shanghai's datum
uLongf ulUCLen = city.GetUCLen();
ulongf ulCLen = city.GetCLen();
BYTE *pbCAddr = new BYTE[ulCLen];
BYTE *pbUCAddr = new BYTE[ulUCLen];
ASSERT(pbCAddr != NULL);
ASSERT(pbUCAddr != NULL);
fileJP.Seek(city.GetOffset(), CFile::begin);
ASSERT(fileJP.Read(pbCAddr, ulCLen) == ulCLen);
if (uncompress(pbUCAddr, &ulUCLen, pbCAddr, ulCLen) != Z_OK)
{
AfxMessageBox("uncompress error!");
return;
}
delete []pbCAddr;
// 银行
int *pPIJPIndexLen = (int*)((BYTE*)&city + 0x10);
int *pRdJPIndexLen = (int*)((BYTE*)&city + 0x14);
BYTE *pbTemp = pbUCAddr;
BYTE *pbNIStart = pbUCAddr + *pPIJPIndexLen + *pRdJPIndexLen;
int nOffset1 = 0;
int nOffset2 = 0;
CFile fileName;
fileName.Open("..\\stat.txt", CFile::modeCreate | CFile::modeReadWrite);
USHORT usEnter = 0x0A0D;
CString strStat;
strStat.Format("%d", *pPIJPIndexLen);
fileName.Write(strStat.GetBuffer(0), strStat.GetLength());
fileName.Write(&usEnter, sizeof(usEnter));
strStat.Format("%d", *pRdJPIndexLen);
fileName.Write(strStat.GetBuffer(0), strStat.GetLength());
fileName.Write(&usEnter, sizeof(usEnter));
fileName.Write(&usEnter, sizeof(usEnter));
for (int i = 0; i < CHARACTER_INDEX_COUNT*2; ++i)
{
memcpy(&nOffset1, pbNIStart + 0x3 + i*0x8, sizeof(nOffset1));
strStat.Format("%d", nOffset1 - nOffset2);
nOffset2 = nOffset1;
fileName.Write(strStat.GetBuffer(0), strStat.GetLength());
fileName.Write(&usEnter, sizeof(usEnter));
if (i%2 == 0)
{
fileName.Write(&usEnter, sizeof(usEnter));
}
}
strStat.Format("%d", ulUCLen - *pPIJPIndexLen - *pRdJPIndexLen - 0x10*0x18 - nOffset1);
fileName.Write(strStat.GetBuffer(0), strStat.GetLength());
fileName.Write(&usEnter, sizeof(usEnter));
fileName.Close();
fileJP.Close();
delete []pbUCAddr;
pbUCAddr = NULL;
CString str("Statistic was saved in path: ");
str += fileName.GetFilePath();
AfxMessageBox(str);
}
void CMakeJianPinIndexDlg::OnBUTTONCityAll()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
TCHAR szFilter[] = _T("Txt file(*.txt)|*.txt|All Files(*.*)|*.*|");
CFileDialog dlgFile(TRUE, NULL, NULL,
OFN_HIDEREADONLY, szFilter, NULL);
if (dlgFile.DoModal() == IDOK)
{
m_strCityAll = dlgFile.GetPathName();
m_strCityAll.MakeLower();
UpdateData(FALSE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -