我是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;
答案 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::string
(newname
),并且您似乎知道如何将其与需要{{1}的(旧/遗留/ C)函数一起使用},即其char const *
成员函数。为什么不写c_str()
?