2011-04-07 47 views
1

我有一个扩展名较少的文件,我想为其添加.avi扩展名。因此,我调用这个函数通过OPENFILE对话框中选择文件后(我想要重命名后打开文件):尝试向文件添加扩展名时,Rename()函数不起作用

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; 
} 

文件名就是不改变,我不知道为什么。测试打印显示oldnamenewname包含正确的字符串(旧的没有扩展名和新的)。

+3

'new []'count:1.'delete []'count:0呃哦。你有没有考虑过'std :: vector'? – 2011-04-07 00:39:24

+0

你检查了errno吗? http://msdn.microsoft.com/en-us/library/zw5t957f%28vs.71%29.aspx – littleadv 2011-04-07 00:59:54

回答

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. 记住,当你使用newnew[],你必须使用deletedelete[]后(当不再需要使用newnew[]创建的对象)。
  2. 在玩字符串时,尽量使用std::string。它可以帮助您不必手动处理内存,并且可以将它们分配/复制到其他变量。
  3. 而不是使用new[],通常建议使用std::vector来代替。将矢量调整为所需的大小。当您需要指向第一个元素的指针时,请使用&vec[0]。使用std::vector的好处是可以为您完成内存管理。
  4. 不要手动计算字符串的长度,请使用类似strlen的函数。或者,可使用str.length()获得std::string的长度。
+0

嗨, 我知道我必须删除[],当我意识到代码无法正常工作时,我只是不在意它;我只是在下一步中添加它。 我从来没有使用过std :: string,但现在看起来确实是更好的选择,所以我将重写代码。非常感谢您对std :: string的基本解释 – Smejki 2011-04-07 10:07:41

2

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

我建议使用std :: string来代替。然而,如果你想留在C风格的字符串,试试这个:

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

祝你好运!

+0

不sizeof(扩展名)已包含空终止符? – Pablo 2011-04-07 01:02:00

+0

@巴勃罗 - 哎呀 - 你是对的!我在想这是一个强大的,而不是一个大小!正在更正... – 2011-04-07 01:40:40

+0

哦,谢谢,这工作。 我从来没有使用过它,但我同意,std :: string会更好,因为我现在已经阅读了一些内容。 – Smejki 2011-04-07 09:59:33