重命名两个目录中的文件名,如果它们之间的某些字符匹配 - 矢量下标超出范围



我实习的第一份工作是编写一个程序来比较两个不同目录的文件名中的某些字符,如果它们匹配,则重命名它们。我编写了一个自定义代码来匹配字符。最初的几个文件在两个目录中都被重命名,但它在一点后中断,给出矢量下标超出范围错误。

我知道如何从所有其他帖子中修复这样的矢量范围错误,但似乎没有任何效果。任何意见将不胜感激!

PS:我不是程序员,这是我的第三个正式程序。我知道代码有点混乱。

这是代码:

#include<dirent.h>
#include<vector>
#include<sstream>
int main()
{
    cout << "Comparer - Renamer v.0.1.betann";
    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;
}

目前,代码已设置为向我展示了如何进行文件名之间的比较。

事实证明我没有正确调试,问题出在代码的这一部分:

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];

我不知道我不能将字符串/字符中的整数直接分配给整数。我将 char 转换为 int(这将给我字符的 ASCII 值(,然后将其减去 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);

条件中还有一个小的手动错误,我也纠正了。

最新更新