转换之前,首先了解几点:
-
工程的编码属性不同,CString的存储方式也不一样。
a) 比如unicode字符集时,CString会被定义成CStringW,其内部是wchar宽字符。每个英文字母也会占用2个字节,如果不转换直接输出则只能输出第一个字符(第二个字符为0被截断了)。
b) 多字节时,CString被定义为CStringA,其内部是char单字节字符。 -
CString有一个GetBuffer()函数,可以获取指向字符缓冲区的非常量指针。并且会锁定缓冲区长度。如果程序后面还要操作这个CString,且会修改长度。则一定记得要调用ReleaseBuffer()解除锁定。如果只是读取,则不用。当GetBuffer()有参数时,如果输入值小于缓冲区长度,则返回的指针跟前面说的一样。如果大于当前长度,则系统会重新realloc一份大的空间,覆盖原来的位置,实现动态增长。
-
一些常用的代号。
char - A
tchar - T
bstr - OLE
wchar - w
const - C -
mfc自带的一些宏定义转换。比如CT2A表示从tchar转到char。CW2A表示从宽字符转为单字符。后续发展时,我们只需使用CT2A即可,它兼容包括了w。
下面开始介绍CString转为char *的几种方法,以unicode工程属性为例:
- 用%S进行宽字符输出或者格式化。
char FileName[256] = {0};
CString strText = _T("abc.txt");
_snprintf_s(FileName, 256, "log/%S", strText.GetBuffer());
- 用一个中间变量进行过渡。
char FileName[256] = {0};
CString strText = _T("abc.txt");
char tmp_str[100] = { 0 };
strcpy_s(tmp_str, CT2A(strText.GetBuffer()) );
_snprintf_s(FileName, 256, "log/%s", tmp_str);