Функция Rename () не работает при попытке добавить расширение в файл - PullRequest
1 голос
/ 07 апреля 2011

У меня есть файл без расширения, и я хочу добавить к нему расширение .avi.Поэтому я вызываю эту функцию после выбора файла через диалог открытия файла (я хочу, чтобы файл открывался после переименования):

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 содержат правильные строки (старые без расширения и новые с ним).

Ответы [ 2 ]

3 голосов
/ 07 апреля 2011

Поскольку вы используете 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. Помните, что когда вы используете new или new[], вы должны использовать delete или delete[] позже (когда объект, созданный с помощью new или new[] больше не нужен).
  2. При игре со строками старайтесь использовать std::string как можно больше. Это избавит вас от необходимости обрабатывать память вручную, и их можно назначать / копировать в другие переменные.
  3. Вместо использования new[] часто рекомендуется использовать std::vector. Измените размер вектора до желаемого размера. Когда вам требуется указатель на первый элемент, используйте &vec[0]. Преимущество использования std::vector заключается в том, что управление памятью сделано для вас.
  4. Не рассчитывайте длину строк вручную, используйте функцию типа strlen. В качестве альтернативы, длина std::string может быть получена с помощью str.length().
2 голосов
/ 07 апреля 2011

Вы не можете скопировать строку в стиле C, присвоив значения указателя. Ваш код динамически создает новый буфер, а затем мгновенно теряет его, присваивая этот указатель.

Я предлагаю вместо этого использовать std :: string. Однако, если вы хотите остаться со строками в стиле C, попробуйте это:

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

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...