Функция remove () удаляет все остальные файлы

я имею vector<string> files с именем пяти файлов:

C: \ Directory \ d.txt

C: \ Directory \ e.txt

C: \ Directory \ f.txt

C: \ Directory \ g.txt

C: \ Directory \ 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)

он удаляет все файлы, но приложение все еще не работает с ошибкой «Ошибка отладки! …» (все сообщение вверху в этом сообщении).

0

Решение

Я полагаю, что ваш код удаления корректирует положение элементов в массиве. Пример:

012345

После удаления 2 у вас есть

01345

не

01_345

Таким образом, вы хотите удалить 0-й элемент (или, вероятно, последний элемент будет более оптимальным) из вашего массива files.size (). Поэтому замените эту строку:

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

Другие решения

Просто быстрое примечание, я был смущен комментарием, что стандарт 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(),

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector