4

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これが「入力」、strBackupFileName「出力」です(2つの操作を逆にする必要がありますか?)。トリッキーな部分は、(間違っている場合は訂正してください)Unicode文字列を使用しているため、これらの文字を探すの.xmlXMLは簡単ではありません。最新のPythonにはこれらの問題はありません。これは、'.'とが両方とも長さ1の"."Unicode文字列(タイプではない)であり、どちらもドットのみを含んでいるためです。"char"

戻りタイプがvoid-であることに注意してください-それについてはあまり心配しないでください。エラーをユーザーに通知する方法の詳細については、退屈させたくありません。Pythonの例では、アサーションを使用しました。そのようなことをするか、のようなコメントを含めることができます// ERROR: [REASON]

不明な点がないかお尋ねください。std::string関数パラメーターの代わりになどを使用するための提案はCAtlString、私が探しているものではありません。必要に応じて関数内で変換することもできますが、1つの関数に異なる文字列タイプを混在させたくないと思います。VS2010を使用して、このC++をWindowsでコンパイルしています。これは、私がインストールしないことBOOSTQTStringまたは箱から出して利用できない他のライブラリを意味します。魔法を有効にするためにまたは他のヘッダーを盗むことboostも正しい解決策ではありません。

ありがとう。

4

2 に答える 2

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");
  }
}
于 2010-07-12T05:32:51.670 に答える
3

コードのように文字列を分割しませんでした。これは、C ++での作業が少し多く、実際には利益がないためです(速度が遅く、このタスクでは実際に行う必要はありません)。

string filename = "TheFileName.Something.xMl";
size_t pos = filename.rfind('.');
assert(pos > 0 && pos == filename.length()-4); // the -4 here is for length of ".xml"
for(size_t i = pos+1; i < filename.length(); ++i)
    filename[i] = tolower(filename[i]);
assert(filename.substr(pos+1) == "xml");
filename = filename.substr(0,pos+1) + "bak";
std::cout << filename << std::endl;
于 2010-07-09T22:12:28.767 に答える