0

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

Files:d.txtf.txt确实h.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)

它删除了所有文件,但应用程序仍然因错误“调试断言失败!...”而崩溃(整个消息在这篇文章的顶部)。

4

2 回答 2

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.
}
于 2013-08-29T15:29:19.950 回答
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().

于 2013-08-29T15:45:58.377 回答