删除文件并用C ++记录

时间:2014-03-15 08:34:52

标签: c++

我是C ++的新手。我编写了一个程序,允许用户将文件添加到我的数据文件夹中。但现在我想让用户删除文件。因此,在下面的情况中,它将显示数据文件夹中的可用文件列表。用户通过输入数字来选择文件,例如,[i]从列表中删除文件,并在数据文件夹中删除。我已经尝试编写代码来删除它,但我收到此错误“Debug Assertion Failed”。我的删除有问题吗?

case 'D':
case 'd':
    myfiles = getFiles();
    cout << "Current available objects:" << endl;
    for (int i = 0; i < myfiles.size(); i++)
        cout << '[' << i << ']' << ' ' << myfiles[i] << endl;
    cout << endl << "Enter file number to delete or \"end\" to exit:";
    while (cin >> str)
    {
        if (str == "end")
            break;
        input = str2int(str);
        if (input >= 0 && input < myfiles.size())
        {
            //Delete object
            newname = ExePath() + "/data/" + myfiles[input];
            name = new char[newname.size() - 1];
            strcpy(name, newname.c_str());
            remove(name);

            //Print out the available objects
            cout << "\nCurrent available objects:" << endl;
            for (int i = 0; i < myfiles.size(); i++)
                cout << '[' << i << ']' << ' ' << myfiles[i-1] << endl;
            cout << endl << "Enter file number to delete or \"end\" to exit:";
        }
        else cout << "Invalid input." << endl;
    }
    break;

2 个答案:

答案 0 :(得分:1)

至少你应该使用

name = new char[newname.size() + 1];

而不是

name = new char[newname.size() - 1];

无论如何,我没有看到需要复制字符串。 还会失败的是:

myfiles[i-1]
在第二个循环中

,因为它从0开始。

答案 1 :(得分:1)

我认为这就是这个循环:

 for (int i = 0; i < myfiles.size(); i++)
                cout << '[' << i << ']' << ' ' << myfiles[i-1] << endl;

i为0时,您尝试访问myfiles[-1]。如果myfiles不是非常奇怪类的对象,它以不寻常的方式重载operator[],而只是正常std::vector(可能性增加99%) :)),那么这是未定义的行为,即任何事情都可能发生(包括你看到的错误信息)。

作为旁注,您正在执行指针操作,而不是始终使用真实的C ++字符串(即std::string个对象)。这是令人惊讶的,因为您似乎已经有std::stringnewname),并且您似乎知道如何将其与需要{{1}的(旧/遗留/ C)函数一起使用},即其char const *成员函数。为什么不写c_str()