1

已取得的成就列表以及我坚持的内容以帮助理解我的要求

我所取得的成就:

打开用户指定的目录,显示该目录下的所有文件。

我尚未达到的目标:

根据预定义的名称自动重命名此目录中的所有文件 - 文件当前命名为随机字符,我希望自动将它们重命名为“August 1”、“August 2”、“August 3”等。文件有不同的扩展名,我希望扩展保持不变。

所以这就是我打开和显示目录的方式:

void DirectorySelector::OpenDirectory(void)
{
    // convert directory string to const char
    DIRECTORY = directory.c_str();

    pdir = opendir (DIRECTORY);
}

void DirectorySelector::DisplayDirectory(void)
{
    // read directory
    while (pent = readdir (pdir))
    {
        std::cout << pent->d_name << "\n";
    }
}

这就是我坚持的,重命名文件(文件有不同的扩展名,不确定这是否会在以后引起问题?)

一旦程序到达 while 循环,我就会收到以下错误:

MultipleRename.exe 中 0x009657C1 处的未处理异常:0xC0000005:访问冲突读取位置 0xCCCCCDE0。

void DirectoryOperator::StandardRename(void)
{   
    i = 1;

    while (pent = readdir (pdir))
    {
        oldname = pent->d_name;
        newname = "August " + i;

        OLDNAME = oldname.c_str();
        NEWNAME = newname.c_str();

        rename(OLDNAME, NEWNAME);
        i++;
    }   
}

注意:所有声明都在其他地方处理,并且为了简单起见删除了验证,如果您需要代码,我可以发布它。此外,我已经检查过 DirectoryOperator 类中的目录是否仍然打开,并且我在 Windows 上使用 MSVS2012。

提前致谢。

4

2 回答 2

2

线路有问题:

newname = "August " + i;

"August" 是一个 char*,在指针转换为 std::string 之前将 i 添加到指针。

因此,当 i==1 时,您的字符串将是“ugust”,当它是 2 时,它将是“gust”。很快,当 i > 8 时,您将遇到未定义的行为。

解决方案:

newname = "August " + std::to_string(i); // c++11

或者

#include<sstream>  
...
stringstream ss;
ss << "August " << i;
newname = ss.str();
于 2014-08-15T20:08:20.937 回答
1

“程序一到 while 循环,我就会收到以下错误:”

Unhandled exception at 0x009657C1 in MultipleRename.exe: 0xC0000005: Access violation reading location 0xCCCCCDE0.

很可能pdir在代码时没有正确初始化

while (pent = readdir (pdir))

叫做。该值0xC0000005表明您正在尝试取消引用nullptr某个地方。

你确定,那

pdir = opendir (DIRECTORY);

按预期顺序调用,结果有效(pdir != nullptr)?

于 2014-08-15T19:32:28.090 回答