MFC常用工具函数总结

文件管理类

判断文件是否存在

BOOL IsFileExist(const CString& strFile)
{
	DWORD dwAttrib = GetFileAttributes(strFile);
	return INVALID_FILE_ATTRIBUTES != dwAttrib && 0 == (dwAttrib & FILE_ATTRIBUTE_DIRECTORY);
}

判断文件夹是否存在

BOOL IsDirExist(const CString& strDir)
{
	DWORD dwAttrib = GetFileAttributes(strDir);
	return INVALID_FILE_ATTRIBUTES != dwAttrib && 0 != (dwAttrib & FILE_ATTRIBUTE_DIRECTORY);
}

判断文件或文件夹是否存在

BOOL IsPathExist(const CString& strPath)
{
	DWORD dwAttrib = GetFileAttributes(strPath);
	return INVALID_FILE_ATTRIBUTES != dwAttrib;
}

字符串处理类

字符串分割

void SplitString(CString str, CString spliter, CStringArray& arr)
{
	str.Trim();
	int pos = str.Find(spliter);

	while (pos != -1)
	{
		CString left = str.Left(pos);
		left.Trim();
		arr.Add(left);

		str = str.Mid(pos+spliter.GetLength());
		str.Trim();
		pos = str.Find(spliter);
	}

	if (!str.IsEmpty())
	{
		arr.Add(str);
	}
}

字符串多字节编码转UTF8编码

CString MbcsToUtf8(const char* src)
{
	// MFC多字节模式
	CString str;
	WCHAR* pwchar = NULL; // 16位宽字符串指针
	CHAR*  pchar  = NULL; // 8位字符串指针

	// 判断文件输入输出函数使用的是ANSI代码页还是OEM代码页
	int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;

	// 获取存储宽字符串所需要的空间(单位为WCHAR)
	int len = MultiByteToWideChar(codepage, 0, src, -1, NULL, 0);
	pwchar = new WCHAR[len]; // 为宽字符串分配内存空间
	if (pwchar == NULL) return str;

	// 将字符串转换为宽字符串
	len = MultiByteToWideChar(codepage, 0, src, -1, pwchar, len);

	if (len != 0)
	{
		len = WideCharToMultiByte(CP_UTF8, 0, pwchar, -1, NULL, 0, NULL, NULL);
		pchar = new CHAR[len];
		if (pchar != NULL)
		{
			// 将字符串转换为UTF8编码
			len = WideCharToMultiByte(CP_UTF8, 0, pwchar, -1, pchar, len, NULL, NULL);
			if (len != 0)
			{
				str = pchar;
			}
			delete [] pchar;
		}
	}

	delete [] pwchar;

	return str;
}

字符串UTF8编码转多字节编码

CString Utf8ToMbcs(const char* src)
{
	// MFC多字节模式
	CString str;
	WCHAR* pwchar = NULL; // 16位宽字符串指针
	CHAR*  pchar  = NULL; // 8位字符串指针

	// 获取存储宽字符串所需要的空间(单位为WCHAR)
	int len = MultiByteToWideChar(CP_UTF8, 0, src, -1, NULL, 0);
	pwchar = new WCHAR[len]; // 为宽字符串分配内存空间
	if (pwchar == NULL) return str;

	// 将字符串转换为宽字符串
	len = MultiByteToWideChar(CP_UTF8, 0, src, -1, pwchar, len);

	if (len != 0)
	{
		// 判断文件输入输出函数使用的是ANSI代码页还是OEM代码页
		int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;

		len = WideCharToMultiByte(codepage, 0, pwchar, -1, NULL, 0, NULL, NULL);
		pchar = new CHAR[len];
		if (pchar != NULL)
		{
			// 将字符串转换为UTF8编码
			len = WideCharToMultiByte(codepage, 0, pwchar, -1, pchar, len, NULL, NULL);
			if (len != 0)
			{
				str = pchar;
			}
			delete [] pchar;
		}
	}

	delete [] pwchar;

	return str;
}

CStringA转CStringW

CStringW CStrAToCStrW(const CStringA& strA)
{
	CStringW strW;
	WCHAR* pwchar = NULL;

	// 判断文件输入输出函数使用的是ANSI代码页还是OEM代码页
	int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;

	// 获取存储宽字符串所需要的空间(单位为WCHAR)
	int len = MultiByteToWideChar(codepage, 0, strA, -1, NULL, 0);
	pwchar = new WCHAR[len]; // 为宽字符串分配内存空间
	if (pwchar == NULL) return strW;

	// 将窄字符串转换为宽字符串
	len = MultiByteToWideChar(codepage, 0, strA, -1, pwchar, len);

	if (len != 0)
	{
		strW.Format(L"%s", pwchar);
	}

	delete [] pwchar;

	return strW;
}

CStringW转CStringA

CStringA CStrWToCStrA(const CStringW& strW)
{
	CStringA strA;
	CHAR* pchar = NULL;

	// 判断文件输入输出函数使用的是ANSI代码页还是OEM代码页
	int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;

	int len = WideCharToMultiByte(codepage, 0, strW, -1, NULL, 0, NULL, NULL);
	pchar = new char[len];
	if (pchar == NULL) return strA;

	// 将宽字符串转换窄字符串
	len = WideCharToMultiByte(codepage, 0, strW, -1, pchar, len, NULL, NULL);

	if (len != 0)
	{
		strA.Format("%s", pchar);
	}

	delete [] pchar;

	return strA;
}

全角转半角

BOOL FullWidthToHalfWidth(CString& strSrc, CString& strDest)
{
	if (strSrc.IsEmpty())
	{
		return FALSE;
	}

	int nSrcStrSize = strSrc.GetLength() * sizeof(TCHAR);
	int nDestStrSize = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_HALFWIDTH, strSrc, nSrcStrSize, NULL, 0);

	PTCHAR lpDestStr;
	lpDestStr = new TCHAR[nDestStrSize + 1];
	ZeroMemory(lpDestStr, nDestStrSize + 1);

	if (LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_HALFWIDTH, strSrc, nSrcStrSize, lpDestStr, nDestStrSize) != 0)
	{
		strDest = lpDestStr;
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

将多个空格字符转化为一个空格字符

CString RemoveRedundantSpace(CString strSrc)
{
	if (strSrc.IsEmpty())
	{
		return strSrc;
	}

	int nIndex = 0;
	CStringW strDest = CStrAToCStrW(strSrc);

	while (nIndex < strDest.GetLength())
	{
		if (strDest[nIndex] == _T(' '))
		{
			do 
			{
				nIndex++;
				if (strDest[nIndex] == _T(' '))
				{
					strDest.Delete(nIndex--);
				}

			} while (nIndex < strDest.GetLength() && strDest[nIndex] == _T(' '));
		}

		nIndex++;
	}

	return CStrWToCStrA(strDest);
}

去除小数点后的零

CString RemoveFloatTailZero(CString strFloat)
{
	CString strText = strFloat;
	int nIndex = strText.Find(_T('.'));

	if (nIndex >= 0)
	{
		strText.TrimRight('0');
		if (strText.GetLength() == nIndex + 1)
		{
			strText = strText.Left(nIndex);
			if (strText.IsEmpty())
				strText = _T('0');
		}
	}

	return strText;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值