1

我有一个无扩展名的文件,我想为.avi它添加一个扩展名。所以我通过openfile对话框选择文件后调用这个函数(我想在重命名后打开文件):

int RenameVidAddExt(HWND hWnd, char oldname[MAX_PATH])
{
    int filenamesize=0, n=0;
    char extension [] = ".avi";
    char* newname;

    for (n=0 ; oldname[n]!=NULL ; n++)
    {
        filenamesize++;                                 
    }

    newname = new char[filenamesize+sizeof(extension)];

    newname = oldname;
    strcat (newname, extension);
    //SetDlgItemTextA(hWnd, IDC_EDIT1, szFile);     //test print of filenameof selected file
    //SetDlgItemTextA(hWnd, IDC_EDIT2, newname);    //test print of newname
    rename(oldname,newname);
    return 0;
}

文件名只是没有改变,我不知道为什么。测试打印显示两者都oldname包含newname正确的字符串(旧的没有扩展名,新的有它)。

4

2 回答 2

3

由于您使用的是 C++,因此请考虑使用std::string

int RenameVidAddExt(HWND hWnd, char oldname[MAX_PATH])
{
    char extension [] = ".avi";
    std::string newname = oldname;

    newname += extension;

    rename(oldname, newname.c_str());

    return 0;
}

一些旁注:

  1. 请记住,当您使用newor时new[],您必须使用deleteordelete[]以后(当不再需要使用 or 创建的对象时)newnew[]
  2. 弹奏弦乐时,尽量std::string多用。它将使您不必手动处理内存,并且可以将它们分配/复制到其他变量。
  3. 而不是使用new[],通常建议使用std::vector。将矢量调整为所需的大小。当您需要指向第一个元素的指针时,请使用&vec[0]. 使用 a 的好处std::vector是为您完成了内存管理。
  4. 不要手动计算字符串的长度,使用类似strlen. 或者,std::string可以使用 获得a 的长度str.length()
于 2011-04-07T01:00:23.857 回答
2

您不能通过分配指针值来复制 C 风格的字符串。您的代码会动态创建一个新缓冲区,然后通过分配给该指针来迅速将其孤立。

我建议改用 std::string 。但是,如果您想保留 C 风格的字符串,请尝试以下操作:

newname = new char[filenamesize + sizeof(extension)];
strcpy(newname, oldname);   // Copies the original string character by character
strcat(newname, extension);  

祝你好运!

于 2011-04-07T00:59:49.523 回答