如果您对 Python 一无所知,我深表歉意,但是,以下代码片段对任何人来说都应该非常易读。唯一需要注意的技巧 - 使用 [-1]
索引列表会为您提供最后一个元素(如果有的话),否则会引发异常。
>>> 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
是“input”,strBackupFileName
是“output”(是不是应该把两者的oprder颠倒过来?)。棘手的部分是(如果我错了请纠正我)我正在使用 Unicode 字符串,因此寻找这些字符:.xmlXML
并不那么简单。最新的 Python 没有这些问题,因为 '.'
和 "."
都是 Unicode 字符串(不是 "char"
类型)的长度1, 都只包含一个点。
注意返回类型是void
——不用太担心。我不想让您厌烦我们如何将错误反馈给用户的细节。在我的 Python 示例中,我只使用了一个断言。您可以做类似的事情,或者只包含一个注释,例如 //ERROR: [REASON]
。
有什么不明白的请追问。使用 std::string
等代替 CAtlString
作为函数参数的建议不是我想要的。如果需要,您可以在函数内部转换它们,但我不希望在一个函数中混合使用不同的字符串类型。我正在使用 VS2010 在 Windows 上编译这个 C++。这意味着我不会安装 BOOST
、QTString
或其他不可用的库。窃取 boost
或其他 header 以启用某些魔法也不是正确的解决方案。
谢谢。
最佳答案
如果您使用的是 ATL,为什么不直接使用 CAtlString
的方法呢?
CAtlString filename = _T("TheFileName.Something.xMl");
//search for '.' from the end
int dotIdx = filename.ReverseFind( _T('.') );
if( dotIdx != -1 ) {
//extract the file extension
CAtlString ext = filename.Right( filename.GetLength() - dotIdx );
if( ext.CompareNoCase( _T(".xml" ) ) == 0 ) {
filename.Delete( dotIdx, ext.GetLength() ); //remove extension
filename += _T(".bak");
}
}
关于c++ - 帮助我将替换文件名扩展名的 Python 代码翻译成 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3216805/