c++ - 帮助我将替换文件名扩展名的 Python 代码翻译成 C++

标签 c++ python visual-studio-2010 string 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

我需要将此逻辑转换为具有以下签名的 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++。这意味着我不会安装 BOOSTQTString 或其他不可用的库。窃取 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/

相关文章:

c++ - 拖放文件名 Visual (Managed) C++

c++ - 运算符重载和堆与堆栈的混淆

c++客户端在不同端口上有响应

python - 正则表达式按数字匹配组

c# - 奇怪的 Visual Studio 行为

c# - 在解决方案之间共享文件, “Add as Link” 无法按预期工作

c# - ListView 中指定列的粗体文本不起作用

c++ - 具有相同存储类型的 vector 之间的函数不匹配

python - Pandas 中连续数据的平行坐标图

python - Pandas如何通过在每列的任何行中获取值='yes'来组合行分组名称