0

私はvector<string> files5つのファイルの名前を持っています:

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、とは削除されません。2 番目と 4 番目のファイルは常に残り、削除されません。7 つのファイル名で新しいベクターを作成した場合、コードは 1 番目、3 番目、5 番目、7 番目のファイルを削除します。f.txth.txte.txtg.txt

なぜ知りたいのですか?私のコードのどの部分が他のすべてのファイルを無視しますか?

PS。Visual Studio 2012 を使用しています。

アップデート:

remove() 関数は、windows.h ヘッダーの標準関数です。私は自分自身を書きません。 vector<string>files大丈夫なはずです-アイテムを追加しますfiles.push_back("C:\\Directory\d.txt")-そして、このように5回。

@ChrisCMファイルの削除を手伝ってください:行を置き換えたとき:

if(remove(files[b]) == 0)

彼の行で:

if(remove(files[files.size() - 1]) == 0)

すべてのファイルを削除しますが、アプリケーションは「Debug Assertion Failed!...」というエラーで引き続きクラッシュします (この投稿の一番上のメッセージ全体)。

4

2 に答える 2

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 に答える