开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。

1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是”相同“的错误记录。
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,如果它们的名字的后16个字符相同,也被视为相同的错误记录
4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准

img


#include <iostream> #include<algorithm>
#include<vector>
using namespace std;
struct error_codes{
    string filename;
    int codeline;
    int counter=1;
    bool operator==(const error_codes &a){
       if(a.filename==filename&&a.codeline==codeline)
        return true;
       else
        return false;
    }

};
string getfilename(string f){  //从地址字符串中,获取最后的文件名
    char *fronts,*backs;
    fronts=&f[0];
    backs=&f[0];
    while(*fronts!='\0'){
        if(*fronts=='\\'){
          backs=fronts;
        }
        ++fronts;
    }
    string result;
    ++backs;
    if(*fronts=='\0'){
        while(fronts!=backs){
            result=result+*backs;
            ++backs;
        }
        backs+='\0';
    }
    if(result.size()>16)
        result=result.substr(result.size()-16,16);
    return result;
}

int main()
{

    vector<error_codes> inputnumber;
    string filename;
    int codeline=0;
    int i=0;

    while(cin>>filename>>codeline){
        error_codes temp;
        temp.filename=getfilename(filename);
        temp.codeline=codeline;
        vector<error_codes>::iterator res;
         res=find(inputnumber.begin(),inputnumber.end(),temp);
        if(res==inputnumber.end()){     //temp不在inpunumber数组中
            inputnumber.push_back(temp);
        }
        else{
           res->counter++;
        }
        ++i;
    }
    int j=0;
    if(inputnumber.size()>8)
        j=inputnumber.size()-8;
    for(j;j<inputnumber.size();++j){
            cout<<inputnumber[j].filename<<" "<<inputnumber[j].codeline<<" "<<inputnumber[j].counter<<endl;
    }
    return 0;
}