【发布时间】:2013-08-29 15:16:30
【问题描述】:
我有 vector<string> files 的五个文件名:
C:\Directory\d.txt
C:\Directory\e.txt
C:\Directory\f.txt
C:\Directory\g.txt
C:\Directory\h.txt
当我尝试使用此代码显示内容和大小files 时:
int a = files.size();
int b = 0;
cout<<a<<endl;;
for(b; b<a ;b++)
{
cout<<files[b]<<endl;
}
它工作正常 - 文件名和矢量大小都可以。 现在我必须删除这些文件,所以我修改了我的代码:
int a = files.size();
int b = 0;
for(b; b<a ;b++)
{
if(remove(files[b]) == 0)
{
cout<<GetLastError();
cout<<"\nRemoved: "<<files[b]<<endl;
}
}
但它不起作用 - 应用程序因错误而崩溃:
调试断言失败!
程序:C:\Windows\system32\MSVCP110D.dll 文件:c:\program 文件 (x86)\microsoft visual studio 11.0\vc\include\vector 行:1140
表达式:向量下标超出范围
有关您的程序如何导致断言失败的信息, 请参阅有关断言的 Visual C++ 文档。
(按重试调试应用程序)
GetLastError 成功删除后返回代码 18(没有更多文件。)。
输出:
18 已移除:C:\Directory\d.txt
18 已移除:C:\Directory\f.txt
18 删除:C:\Directory\h.txt
文件:d.txt、f.txt 和 h.txt 确实被删除,但 e.txt 和 g.txt 没有。
第二个和第四个文件始终保留而不被删除。如果我创建了具有 7 个文件名的新向量,我的代码将删除第 1 个、第 3 个、第 5 个和第 7 个文件。
我想知道为什么?我的代码的哪一部分忽略了所有其他文件?
PS。我正在使用 Visual Studio 2012。
更新:
remove() 函数是 windows.h 头文件中的标准函数。我不写我自己的。
vector<string>files 应该没问题 - 我用 files.push_back("C:\\Directory\d.txt") 添加项目 - 像这样五次。
@ChrisCM 帮我删除文件:当我替换行时:
if(remove(files[b]) == 0)
用他的台词:
if(remove(files[files.size() - 1]) == 0)
它删除了所有文件,但应用程序仍然崩溃并出现错误“调试断言失败!...”(整个消息在这篇文章的顶部)。
【问题讨论】:
-
您的阵列是否正确构建?
-
我认为我们需要查看
remove的代码。如果 remove 应该是该名称的标准 C++ 函数,则发布的代码将无法编译。在这种情况下,我们需要查看真实代码。 -
你需要向我们展示你是如何分配你的数组的,还请逐行浏览你的代码,你可以看到当它崩溃时 b 是什么,以及它在 remove(files[b] ) 或 cout
-
Visual Studio 有一个合理的调试器。恕我直言,比本网站提供的人工调试服务要好得多。
-
请将
a和b声明为size_t而不是int。并不是说这是问题的根源。
标签: c++ file visual-studio-2012 vector delete-file