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