代码之家  ›  专栏  ›  技术社区  ›  1_bug

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

  •  0
  • 1_bug  · 技术社区  · 12 年前

    我有 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;
        }
    }
    

    但它没有工作-应用程序因错误而崩溃:

    调试断言失败!

    程序:C:\Windows\system32\MSVCP110D.dll文件:C:\Program files (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)
    

    它删除了所有文件,但应用程序仍然崩溃,并出现错误“调试断言失败!…”(本文顶部的完整消息)。

    2 回复  |  直到 10 年前
        1
  •  1
  •   MobA11y    12 年前

    我发现您的移除代码很可能正在重新调整数组中项目的位置。例子:

    012345
    

    删除2后,您已经

    01345
    

    01_345
    

    因此,您需要删除数组文件.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.
    }
    
        2
  •  0
  •   Rudolfs Bundulis    12 年前

    只是简单地说一下,我被这个标准的评论弄糊涂了 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;
            }
        }
    }
    

    所以你的肯定有问题 删除() .