hur.cn - 华软网

 热门搜索

UNICODE环境下使用CString的函数的问题

  作者:未知    来源:网络    更新时间:2011/9/15
我的程序是从vc升级到vs2008,原程序代码如下:
// 从带后缀的文件名中获得后缀名
CString CFileOperator::getPostfixName(CString fileName)
{
CString fName =  L"", fn = fileName;
if (int i = fn.ReverseFind(L'.') != -1)
fn.Delete(0, i + 1);
else
fn = _T("");
return fn;
}
但是不能得到正确的文件后缀名,那位大侠帮忙给解答一下?
---华软 网友回答---
首先要弄懂字符集的对应关系,不要乱用
CString对应  _T("XXX")
CStringA对应  "XXX"
CStringW对应  L"XXX"
由于你都是用的CString,就必须用_T("")和_T('.')
---华软网友回复---
引用 1 楼 jackson35296 的回复:
首先要弄懂字符集的对应关系,不要乱用
CString对应  _T("XXX")
CStringA对应  "XXX"
CStringW对应  L"XXX"
由于你都是用的CString,就必须用_T("")和_T('.')

说的真好, unicode还是用_T比较好,俺都是这样做的。
---华软网友回复---
用T("")的话,无论你是UNICODE还是多字节,都能随便移植
---华软网友回复---
想要取后缀名?
so easy
CString strSuffix = fileName.Right(str.GetLength() - str.ReverseFind('.') - 1);

fileName是你的文件全名
strSuffix是后缀名

例如fileName 为 L"C:\\123.txt"
则strSuffix 为L"txt"

这是你想要的么?
---华软网友回复---
也就是说,你的函数只要改为:

CString CFileOperator::getPostfixName(CString fileName)
{
return fileName.Right(str.GetLength() - str.ReverseFind('.') - 1);
}

这样不就OK了?
---华软网友回复---
CString CFileOperator::getPostfixName(CString fileName)
{
int len = fileName.GetLength();
int idx = fileName.ReverseFind('.');
if (idx == -1)
{
return "";
}
return fileName.Right(len - idx - 1);
}
谢谢楼上的兄弟,是不是还需要给你分啊?怎么给?
---华软网友回复---
可以在项目-属性里-- 配置属性----常规--字符集改
---华软网友回复---
引用楼主 hgs74 的回复:
我的程序是从vc升级到vs2008,原程序代码如下:
// 从带后缀的文件名中获得后缀名
CString CFileOperator::getPostfixName(CString fileName)
{
CString fName =  L"", fn = fileName;
if (int i = fn.ReverseFind(L'.') != -1)
fn.Delete(0, i……


说的对,就是这个,这个应该能解决楼主的问题
---华软网友回复---
我觉得直接用L更方便,一般不会说此段代码还要在非UNICODE下使用吧
引用 2 楼 ycf8788 的回复:
引用 1 楼 jackson35296 的回复:

首先要弄懂字符集的对应关系,不要乱用
CString对应  _T("XXX")
CStringA对应  "XXX"
CStringW对应  L"XXX"
由于你都是用的CString,就必须用_T("")和_T('.')

说的真好, unicode还是用_T比较好,俺都是这样做的。

---华软网友回复---
引用 6 楼 hgs74 的回复:
CString CFileOperator::getPostfixName(CString fileName)
{
int len = fileName.GetLength();
int idx = fileName.ReverseFind('.');
if (idx == -1)
{
return "";
}
return fileName.Right(len - idx - 1……



点下面的“结贴”就是了……然后要给谁多少分,可以选的。。呵呵
---华软网友回复---
if (int i = fn.ReverseFind(L'.') != -1)

这里有个bug, 按运算优先级,实际上是 i = (fn.ReverseFind(L'.') != -1),再判断i是否为0.
按你的想法,应该写成
int i = fn.ReverseFind(L'.');
if(i != -1)
    .....
     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。