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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重命名两个目录中的文件名如果它们之间的某些字符匹配 - 矢量下标超出范围相关的知识,希望对你有一定的参考价值。

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

我知道如何从所有其他帖子修复这样的向量范围错误,但似乎没有任何工作。任何输入将不胜感激!

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

现在设置代码使得它向我展示如何进行文件名之间的比较。

答案

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

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。我将char转换为int(这将给我char的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);

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

以上是关于重命名两个目录中的文件名如果它们之间的某些字符匹配 - 矢量下标超出范围的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 重命名文件 - 正则表达式

git重命名许多文件和文件夹

如何确定文件最近一次重命名的时间?

linux下怎么批量重命名这些文件

OSX:如何通过在父文件夹的名称前面加上某些文件来递归重命名它们?

批量重命名目录中的文件