я имею 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.txt18
Удалено: C: \ Directory \ f.txt18
Удалено: 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)
он удаляет все файлы, но приложение все еще не работает с ошибкой «Ошибка отладки! …» (все сообщение вверху в этом сообщении).
Я полагаю, что ваш код удаления корректирует положение элементов в массиве. Пример:
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.
}
Просто быстрое примечание, я был смущен комментарием, что стандарт 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()
,