帮我翻译Python代码,将文件名中的扩展名替换为C++

Ham*_*jan 4 c++ python string visual-studio-2010 unicode-string

如果您对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
Run Code Online (Sandbox Code Playgroud)

我需要将这个逻辑转换为C++(我实际使用的语言,但到目前为止已经很糟糕)的函数具有以下签名:void PopulateBackupFileNameOrDie(CAtlString& strBackupFileName, CAtlString& strXmlFileName);.这里strXmlFileName是"输入",strBackupFileName是"输出"(我应该反转两个的oprder吗?).棘手的部分是(纠正我,如果我错了)我正在使用Unicode字符串,所以寻找这些字符:.xmlXML不是那么直截了当.最新的Python没有这些问题,因为'.'"."都是Unicode字符串(不是"char"长度为1型),二者只包含一个点.

请注意,返回类型是void- 不要太担心它.我不想向您详细介绍我们如何将错误传达给用户.在我的Python示例中,我只使用了一个断言.你可以做类似的事情,或者只是添加评论// ERROR: [REASON].

请问是否有问题.建议使用std::string,而不是CAtlString功能参数不是我要找的.如果必须,您可以在函数内部转换它们,但我不希望在一个函数中混合使用不同的字符串类型.我正在使用VS2010在Windows上编译这个C++.这意味着我不会安装BOOST,QTString或者其他不可用的库.窃取一个boost或其他标题以启用一些魔法也不是正确的解决方案.

谢谢.

Pra*_*ian 6

如果您正在使用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");
  }
}
Run Code Online (Sandbox Code Playgroud)