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

📄 makejianpinindexdlg.cpp

📁 中文编码转换
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				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 + -