项目中用到的,起先log会有一串小方框,后来发现是写入的长度并不是实际转化后的长度,备忘。
自定义函数MyWideCharToMultiByte,功能:将含有中文的宽字符数组转化为多字节字符数组,返回转化后的实际字符个数
int CFuncDlg::MyWideCharToMultiByte_test(WCHAR* wchars,CHAR* schars,int scharsLen)
{
memset(schars,0,scharsLen);
CString m_snd = wchars;
int len = m_snd.GetLength();
CString tmpstr(m_snd); //复制要发送的字符串
int multibytelen=WideCharToMultiByte( //计算从Unicode转换到Ansi后需要的字节数
CP_ACP, //根据ANSI code page转换
WC_COMPOSITECHECK | WC_DEFAULTCHAR, //转换出错用缺省字符代替
(LPCWSTR)tmpstr.GetBuffer(len), //要转换的字符串地址
len, //要转换的个数
0, //转换后字符串放置的地址
0, //最多转换字符的个数,为0表示返回转换Unicode后需要多少个字节
0, //缺省的字符:"\0"
0 //缺省的设置
);
WideCharToMultiByte( //转换Unicode到Ansi
CP_ACP,
WC_COMPOSITECHECK | WC_DEFAULTCHAR,
(LPCWSTR)tmpstr.GetBuffer(len),
len,
(char *)schars, //转换到缓冲区中
scharsLen, //最多个字节
0,
0
);
return multibytelen;
}
写log函数writeResult,输入CString
int CFuncDlg::writeResult(CString result){
CFile myFile;
char *pData = new char[100];
TCHAR *pStrLog = new TCHAR[100];
CString strFile;
strFile.Format(_T("\\ResidentFlash\\CFuncDlglog.txt"));
SYSTEMTIME sys;
GetLocalTime( &sys );
CTime t1(sys);
CString str = _T("");
str.Format(_T("%4d/%02d/%02d %02d:%02d:%02d\r\n")+result, sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond);
int fileLength = str.GetLength();
wcscpy(pStrLog,(LPCTSTR) str);
int cpylen =MyWideCharToMultiByte_test(pStrLog,pData,fileLength*2);
myFile.Open(strFile, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
myFile.SeekToEnd();
myFile.Write(pData,cpylen);
myFile.Flush();
myFile.Close();
delete[] pData;
delete[] pStrLog;
return 0;
}