我有vector<string> files
,其名称为五个文件:
C:\目录\ d.txt
C:\目录\ e.txt
C:\目录\ f.txt
C:\目录\ g.txt
C:\目录\ 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;
}
}
但它没有用 - 应用程序因错误而崩溃:
Debug Assertion失败!
程序:C:\ Windows \ system32 \ MSVCP110D.dll文件:c:\ program files (x86)\ microsoft visual studio 11.0 \ vc \ include \ vector Line: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)
它删除了所有文件,但应用程序仍然崩溃并出现错误“Debug Assertion Failed!...”(本文顶部的整个消息)。
答案 0 :(得分:1)
我发现您的删除代码可能会重新调整数组中项目的位置。示例:
012345
删除2后你有
01345
不是
01_345
因此,您希望删除数组files.size()次的第0个元素(或者可能最后一个元素会更优化)。所以替换这一行:
if(remove(files[b]) == 0)
有了这个:
if(remove(files[0]) == 0)
或最佳
if(remove(files[files.size() - 1]) == 0)
但这当然取决于你对删除的实现,但我发现这个解释很可能是你对症状的解释。
您需要调整for循环以使用此逻辑,否则您将尝试访问向量中不再存在的值:
while(files.size()) {
cout << "\nRemoving: " << files.back() << endl;
remove(files.back());
//Add your error handling here if you wish.
}
答案 1 :(得分:0)
只是一个快速的说明,我对标准remove()
不起作用的评论感到困惑,所以我在VS2012中做了一个快速测试项目,这似乎有效:
// RemoveTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <vector>
#include <iostream>
#include <Windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<char*> files;
files.push_back("C:\\test\\a.txt");
files.push_back("C:\\test\\b.txt");
files.push_back("C:\\test\\c.txt");
int a = files.size();
int b = 0;
for(b; b<a ;b++)
{
if(remove(files[b]) == 0)
{
cout<<GetLastError();
cout<<"\nRemoved: "<<files[b]<<endl;
}
}
}
所以remove()
。