如果您对Python一无所知,我表示歉意,但是,下面的代码段对任何人都应该是非常易读的。唯一值得注意的技巧 - 使用[-1]
为列表编制索引,如果有最后一个元素,则会提供给您最后一个元素,或引发异常。帮我翻译替换文件名中的扩展名的Python代码到C++
>>> fileName = 'TheFileName.Something.xMl'
>>> fileNameList = fileName.split('.')
>>> assert(len(fileNameList) > 1) # Must have at least one period in it
>>> assert(fileNameList[-1].lower() == 'xml')
>>> fileNameList[-1] = 'bak'
>>> fileName = '.'.join(fileNameList)
>>> print(fileName)
TheFileName.Something.bak
我需要这个逻辑转换成C++(我实际使用的语言,但到目前为止,吮吸)具有以下签名功能:void PopulateBackupFileNameOrDie(CAtlString& strBackupFileName, CAtlString& strXmlFileName);
。这里strXmlFileName
是“输入”,strBackupFileName
是“输出”(我是否应该颠倒两者的操作符?)。棘手的部分是(纠正我,如果我错了)我正在处理一个Unicode字符串,所以寻找这些字符:.xmlXML
是不是很直截了当。最新的Python没有这些问题,因为'.'
和"."
都是长度为1的Unicode字符串(不是"char"
类型),都包含一个点。
请注意,返回类型为void
- 不必太担心。我不想让你知道我们如何将错误传达给用户。在我的Python例子中,我只使用了一个断言。你可以做这样的事情,或只是包括一个评论,如// ERROR: [REASON]
。
请问是否有不清楚的地方。建议使用std::string
等而不是CAtlString
作为函数参数,这不是我正在寻找的。如果你需要,你可以在函数内部转换它们,但是我不希望在一个函数中混合不同的字符串类型。我正在使用VS2010在Windows上编译这个C++。这意味着我不会安装BOOST
,QTString
或其他无法使用的库。偷一个boost
或其他标题来启用一些魔法也不是正确的解决方案。
谢谢。
谁投了我票 - 请告诉我为什么我的问题是愚蠢的。 – 2010-07-09 22:30:10
我没有投票给你,但他们可能做到了,因为你要求其他人只是做你的工作,而不是给你一个提示。 – 2010-07-10 00:34:42
看起来我只是可能不得不在这一个悬赏。 – 2010-07-10 02:01:01