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

📄 iniutil.cpp

📁 概述:数据的纵向收集
💻 CPP
字号:
#include "stdafx.h"
#include "IniUtil.h"
#include <wininet.h>			//INTERNET_MAX_PATH_LENGTH
#include <atlutil.h>			//Encode & CUrl
#include <winnls.h>
namespace NIniUtil
{
//////////////////////////////////////////////////////////////////////////

#define DECODE_UNICODE	0
#define KEEP_UNICODE	1
#define DECODE_GBK		0
#define DECODE_BIG5		2

void DecodePureUTF(unsigned char *str, int nFlag)
{
	int nLen;
	u_char *pSrc;
	u_char *pDst;
	BOOL bIsPureUTF;
	char c1, c2, c3, cSave;
	char pszTemp[ 4 ];	// for only one multibyte
	int nMBLen;

	bIsPureUTF = TRUE;
	pSrc = (u_char *)str;
	nLen = (int)strlen((char*)str);
	for (;;)
	{
		if (0xE0 == (*pSrc & 0xF0))	// UTF-8
			pSrc += 3;
		else if (*pSrc < 0x80)
			pSrc++;
		else
		{
			bIsPureUTF = FALSE;
			break;
		}

		if (pSrc - str >= nLen)
			break;
	}

	if (!bIsPureUTF)	// 不是UTF-8
		return;

	pSrc = pDst = str;
	for (;;)
	{
		if (0xE0 == (*pSrc & 0xF0))	// UTF-8
		{
			c1 = *pSrc;
			c2 = *(pSrc + 1);
			c3 = *(pSrc + 2);

			*(pDst+1) = c1 << 4;
			cSave = c2;
			cSave >>= 2;
			*(pDst+1) |= cSave & 0x0F;
			*pDst = c2 << 6;
			*pDst |= c3 & 0x3F;

			if (!(KEEP_UNICODE & nFlag))
			{
				if (DECODE_BIG5 & nFlag)
					nMBLen = WideCharToMultiByte(950, 0, (LPCWSTR)pDst, 1, pszTemp, sizeof(pszTemp), "", NULL);
				else
					nMBLen = WideCharToMultiByte(936, 0, (LPCWSTR)pDst, 1, pszTemp, sizeof(pszTemp), "", NULL);

				memcpy( pDst, pszTemp, nMBLen );
				pDst += nMBLen;
			}
			else
				pDst += 2;

			pSrc += 3;
		}
		else if (*pSrc < 0x80)
		{
			*pDst++ = *pSrc++;
		}

		if (pSrc - str >= nLen)
		{
			*pDst = '\0';
			break;
		}
	}
}

// 拆分字符串:分隔中间如果为空,不会被建立
// 如 |a||||b|c 只会被拆成三个:a/b/c
BOOL SplitString(LPCTSTR lpString, CSimpleArray<CString>& arr, LPCTSTR lpTokens/*=NULL*/)
{
	if(lpTokens == NULL)
		lpTokens = "|";

	arr.RemoveAll();

	CString szString = lpString;
	CString szTemp;
	int curPos  = 0;

	szTemp = szString.Tokenize(lpTokens, curPos);
	while (! szTemp.IsEmpty())
	{
		arr.Add(szTemp);
		szTemp = szString.Tokenize(lpTokens, curPos);
	}

	return (arr.GetSize() > 0);
}

// 拆分字符串:分隔符中间为空,建立空的项
// 如 |a||||b|c 只会被拆成6个:a/ / / /b/c
// 与_SplitString一样,最左边和最右边的分隔符不会对结果有影响(有或没有都可以)
BOOL SplitStringEx(LPCTSTR lpString, CSimpleArray<CString>& arr, TCHAR chToken/*=NULL*/)
{
	if(chToken == 0)
		chToken = '|';

	arr.RemoveAll();

	CString szString = lpString;
	if(szString.IsEmpty())
		return FALSE;

	int nStart = 0;
	int nOffset;

	while(1)
	{
		nOffset = szString.Find(chToken, nStart);

		if(nOffset > 0)
		{
			arr.Add(szString.Mid(nStart, nOffset-nStart));
		}
		else if(nOffset == -1L)
		{
			if(nStart != szString.GetLength())
			{
				arr.Add(szString.Mid(nStart));
			}

			break;
		}

		nStart = nOffset + 1;
	};

	return TRUE;
}

// 规范化搜索词
BOOL DecodeSearchKeyword(LPCTSTR lpSearchWord, CString& strOutWord) 
{
	USES_CONVERSION;

	CHAR szBuffer1[INTERNET_MAX_PATH_LENGTH];
	DWORD dwLen = 0;

	strOutWord.Empty();
	if( AtlUnescapeUrl(T2CA(lpSearchWord), szBuffer1, &dwLen, INTERNET_MAX_PATH_LENGTH) )
	{
		// UTF8
		DecodePureUTF((unsigned char*)szBuffer1, DECODE_GBK);
		strOutWord = szBuffer1;
		return TRUE;
	}

	return FALSE;
}

BOOL CombinationStringArray(CSimpleArray<CString>& arrString, CString& szCombin, LPCTSTR lpSpace)
{
	szCombin.Empty();
	for(int i=0; i<arrString.GetSize(); ++i)
	{
		if(lpSpace && ! szCombin.IsEmpty())
			szCombin += lpSpace;

		szCombin += arrString[i];
	}

	return TRUE;
}
//////////////////////////////////////////////////////////////////////////

void GetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, CString& strReturn, LPCTSTR lpConfigFile)
{
	DWORD dwSize = 1024;
	LPTSTR lpBuffer = new TCHAR[dwSize];

	while(lpBuffer)
	{
		DWORD dwRet = ::GetPrivateProfileString(lpAppName, lpKeyName, lpDefault, lpBuffer, dwSize, lpConfigFile);

		// 可能缓冲区不足
		if(dwRet == dwSize - 1)
		{
			delete []lpBuffer;

			// 放大一倍缓冲区
			dwSize *= 2;
			lpBuffer = new TCHAR[dwSize];
		}
		else
		{
			break;
		}
	}

	if(lpBuffer)
	{
		strReturn = lpBuffer;

		delete []lpBuffer;
		return;
	}

	strReturn = lpDefault;
}

//是否文件存在
BOOL FileExist( PCHAR lpSource )
{
	int nRet = FALSE;

	WIN32_FIND_DATA fd;
	memset( &fd, 0, sizeof(WIN32_FIND_DATA) );

	HANDLE hFile = FindFirstFile( lpSource, &fd );

	// 文件不存在
	if( hFile == INVALID_HANDLE_VALUE )
		return FALSE;

	// 检查文件还是文件夹
	if( fd.cFileName[0] != '.' && fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
		nRet = FALSE;	// 文件夹
	else
		nRet = TRUE;			// 文件

	FindClose(hFile);
	return nRet;
}

//////////////////////////////////////////////////////////////////////////
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -