remove()函数删除所有其他文件

时间:2013-08-29 15:16:30

标签: c++ file visual-studio-2012 vector delete-file

我有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.txtf.txth.txt确实已删除,但e.txtg.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!...”(本文顶部的整个消息)。

2 个答案:

答案 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()

一定有问题