飞鸽传书软件在读写文件时,会遇到UNICODE的文件,怎么办呢?这个给大家一个CStdioFile实现完美支持UNICODE方案,先放着以后可能会用到。
// 目标文件路径名称的宏定义
#define FileURL _T("C://coderui.txt")
//
// 将“单字节的字串符类型(_MSBC环境)”转换为“宽字节的字符串类型(Unicode环境)”
//
INT _MSBCTo_Unicode(CString strInPut_MSBC, CString *strOutPut_Unicode)
{
INT nLen;
CHAR *pcBuf;
if(strInPut_MSBC == _T(""))
{
return 0;
}
pcBuf = (CHAR *)strInPut_MSBC.GetBuffer(strInPut_MSBC.GetLength());
nLen = MultiByteToWideChar(CP_ACP, 0, pcBuf, -1, NULL, 0);
// (Unicode环境WCHAR需要加1,默认已经加1了)
WCHAR *pwBuf = new WCHAR[nLen];
memset(pwBuf, 0, nLen);
MultiByteToWideChar(CP_ACP, 0, pcBuf, -1, pwBuf, nLen);
strOutPut_Unicode->Format(_T("%s"), pwBuf);
delete []pwBuf;
nLen -= 1;
return nLen;
}
//
// 将“宽字节的字符串类型(Unicode环境)”转换为“单字节的字串符类型(_MSBC环境)”
//
INT _UnicodeTo_MSBC(CString strInPut_Unicode, CString *strOutPut_MSBC)
{
INT nLen;
WCHAR *pwBuf;
if(strInPut_Unicode == _T(""))
{
return 0;
}
pwBuf = strInPut_Unicode.GetBuffer(strInPut_Unicode.GetLength());
nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, 0, NULL, NULL);
// (Unicode环境需要加2,不然Format时内存数据格式不对程序会崩)
CHAR *pcBuf = new CHAR[nLen + 2];
memset(pcBuf, 0, nLen + 2);
WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, pcBuf, nLen, NULL, NULL);
strOutPut_MSBC->Format(_T("%s"), pcBuf);
delete []pcBuf;
nLen -= 1;
return nLen;
}
//
// 将保存成“宽字节类型”的“单字节类型”字符串(Unicode环境),
// 还原为正确的“单字节类型”字符串(_MSBC环境)。
//
VOID _UnicodeOf_MSBCTo_MSBC(CString *str)
{
INT nLen;
CHAR *pcBuf;
nLen = str->GetLength();
// (Unicode环境需要加3,不然Format时内存数据格式不对程序会崩)
pcBuf = new CHAR[nLen + 3];
memset(pcBuf, 0, nLen + 3);
for (INT i = 0 ; i < nLen; i++)
{
pcBuf = (CHAR)str->GetAt(i);
}
str->Format(_T("%s"), pcBuf);
delete []pcBuf;
}
//
// 使用“CStdioFile”类进行读文件操作
//
void StdioReadFile()
{
CStdioFile OpenFileR;
CString str_Unicode,str_MSBC;
if(!OpenFileR.Open(FileURL, CFile::modeRead))
{
return;
}
// 按行来循环读文件
do
{
// 把“_MSBC环境”下的“CString”(CHAR),直接填充到了“Unicode环境”下的“CString”(WCHAR)中,
// 这样会导致“汉字”显示成乱码。如果想正确显示,需要对该字符串进行相应的处理。
OpenFileR.ReadString(str_MSBC);
if(str_MSBC != _T(""))
{
// 将保存成“宽字节类型”的“单字节类型”字符串(Unicode环境),
// 还原为正确的“单字节类型”字符串(_MSBC环境)。
_UnicodeOf_MSBCTo_MSBC(&str_MSBC);
// 将“单字节的字串符类型(_MSBC环境)”转换为“宽字节的字符串类型(Unicode环境)”
_MSBCTo_Unicode(str_MSBC, &str_Unicode);
AfxMessageBox(str_Unicode);
}
}while(str_MSBC != _T(""));
OpenFileR.Close();
}
//
// 使用“CStdioFile”类进行写文件操作
//
void StdioWriteFile()
{
int nLength;
HANDLE hFile;
CFileFind pfile;
CStdioFile OpenFileW;
CString str_Unicode,str_MSBC;
if(pfile.FindFile(FileURL, 0))
{
pfile.Close();
if(DeleteFile(FileURL))
{
hFile = CreateFile(FileURL, 0, FILE_SHARE_WRITE, NULL, CREATE_NEW, 0, NULL);
CloseHandle(hFile);
}
else
{
return;
}
}
else
{
hFile = CreateFile(FileURL, 0, FILE_SHARE_WRITE, NULL, CREATE_NEW, 0, NULL);
CloseHandle(hFile);
}
if(!OpenFileW.Open(FileURL, CFile::modeWrite))
{
return;
}
str_Unicode = _T("Coderui您好!/n");
// 将“宽字节的字符串类型(Unicode环境)”转换为“单字节的字串符类型(_MSBC环境)”
nLength = _UnicodeTo_MSBC(str_Unicode, &str_MSBC);
OpenFileW.SeekToEnd();
OpenFileW.Write(str_MSBC, nLength); // 写入“单字节类型的字串符(_MSBC环境)”
OpenFileW.Close();
}
原文:CStdioFile实现完美支持UNICODE方案