Переименование имен файлов в двух каталогах, если определенные символы между ними совпадают — векторный индекс находится вне диапазона

Моя первая работа в качестве стажера состояла в том, чтобы написать программу для сравнения определенных символов в именах файлов двух разных каталогов и, если они совпадают, переименовать их. Я написал собственный код, соответствующий символам. Несколько начальных файлов переименовываются в обе директории, но после точки они ломаются, что приводит к ошибкам векторного индекса вне диапазона.

У меня есть идея, как исправить такую ​​ошибку диапазона векторов из всех других постов, но, похоже, ничего не получалось. Любой вклад будет оценен!

PS: я не кодер, и это моя третья официальная программа. Я понимаю, что код немного грязный.

Вот код:

#include<dirent.h>
#include<vector>
#include<sstream>

int main()
{
cout << "Comparer - Renamer v.0.1.beta\n\n";
string dr1, dr2;
int x, y;

DIR           *d1;
struct dirent *dir1;
vector<string> a;
a.reserve(25000);
int i = 0;
cout << "Enter the first directory (format : log_2017...) : ";
cin >> dr1;
d1 = opendir(dr1.c_str());
if (d1){
while ((dir1 = readdir(d1)) != NULL){
i++;
a.push_back(dir1->d_name);
}
closedir(d1);
}
x = a.size();cout << "\nEnter the second directory (format : 2017.12...) : ";
cin >> dr2;
DIR           *d2;
struct dirent *dir2;
vector<string> b;
b.reserve(25000);
int j = 0;
d2 = opendir(dr2.c_str());
if (d2){
while ((dir2 = readdir(d2)) != NULL){
j++;
b.push_back(dir2->d_name);
}
closedir(d2);
}
y = b.size();

ostringstream osa, nsa, osb, nsb;
string oldname_a, newname_a, oldname_b, newname_b;
int u, v, w;

for (int l = 2; l < x; l++){
for (int k = l; k < y; k++){
int c = a[l][20] * 10 + a[l][21];
int d = b[k][14] * 10 + b[k][15];
int e = a[l][17] * 10 + a[l][18];
int f = b[k][11] * 10 + b[k][12];

if (a[l][4] == b[k][0] && a[l][5] == b[k][1] && a[l][6] == b[k][2] && a[l][7] == b[k][3] && a[l][9] == b[k][5] && a[l][10] == b[k][6] && a[l][12] == b[k][8] && a[l][13] == b[k][9]){
u = 0;
}
else{
u = 1;
}
if ((e - f) == 0 && abs(c - d) < 12){
v = 0;
}
else{
v = 1;
}
if ((e - f) == 1 && ((c == 58) || (c == 59) || (c == 0) || (c == 1) || (c == 2))){
w = 0;
}
else{
w = 1;
}

if (u == 0 && (v == 0 || w == 0)){
osa.str(string());
osa << dr1 << "\\" << a[l];
nsa.str(string());
nsa << dr1 << "\\" << l - 1 << ". " << a[l];
oldname_a = osa.str();
newname_a = nsa.str();

osb.str(string());
osb << dr2 << "\\" << b[k];
nsb.str(string());
nsb << dr2 << "\\" << l - 1 << ". " << b[k];
oldname_b = osb.str();
newname_b = nsb.str();

rename(oldname_a.c_str(), newname_a.c_str())
rename(oldname_b.c_str(), newname_b.c_str())
break;
}
}
}
return 0;
}

В настоящее время код установлен так, что он показывает мне, как выполняется сравнение между именами файлов.

1

Решение

Оказывается, я не отлаживал должным образом, и проблема была в этой части кода:

int c = a[l][20] * 10 + a[l][21];
int d = b[k][14] * 10 + b[k][15];
int e = a[l][17] * 10 + a[l][18];
int f = b[k][11] * 10 + b[k][12];

Я не знал, что не могу назначить целое число из строки / символа непосредственно в int. Я преобразовал char в int (что даст мне ASCII-значение char), а затем вычел его на 48, чтобы преобразовать в десятичное число (я не знаю, есть ли более простой способ сделать это, но это, похоже, сработало для меня!) Модифицированная часть выглядит так:

c = ((int)a[l][20] - 48) * 10 + ((int)a[l][21] - 48);
d = ((int)b[k][14] - 48) * 10 + ((int)b[k][15] - 48);
e = ((int)a[l][17] - 48) * 10 + ((int)a[l][18] - 48):
f = ((int)b[k][11] - 48) * 10 + ((int)b[k][12] - 48);

Была также небольшая ручная ошибка в условиях, которые я также исправил.

0

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

Других решений пока нет …

По вопросам рекламы [email protected]