c++ 之ip+告警统计代码
注意:复制excel的内容到txt中时,删除空行,删除excel列名(如’告警ip’,‘告警次数’),只留需要计算的数据
示例 excel中含有告警ip和告警次数两列,需要统计某个ip的告警之和
复制出ip列表excel去重后,复制到iplist.txt里保存(懒得写去重的代码了,_),
把原始数据 ip+告警次数两列一起复制到rawattacklist.txt中保存
运行代码
其它用途如个人总分统计等,是否会报错就随缘吧
iplist.txt
rawattacklist.txt
运行代码
源代码
需要在运行目录下创建iplist.txt存储去重后的ip,rawattacklist.txt存储原始告警情况(ip与告警次数之间,从excel复制出来默认是以tab键分隔的)
#include<iostream>
#include<fstream>
#include<string>
#include<ctime>
using namespace std;
struct Ipstruct
{
string _ipaddress;
int _total;
Ipstruct(string ipaddress = "", int total = 0)
{
_ipaddress = ipaddress;
_total = total;
}
};
void combine(Ipstruct *iplist,const long long int ipnum,string ip, long long int times);//把次数times计数到ip相同的结构体里
void showAndSaveresult(const Ipstruct *iplist, const long long ipnum);//输出结构体数组的结果
int main()
{
/*统计有多少个已去重ip*/
ifstream ipcount;
ipcount.open("iplist.txt");
if (!ipcount.is_open())
{
cout << "iplist.txt打开失败" << endl;
return 0;
}
string line="";
long long int ipnum = 0;
while (getline(ipcount,line))
{
ipnum++;
}
ipcount.close();
//cout << "有" << ipnum << "个ip" << endl;
//第二部分读取已去重ip
ifstream ipcount1;
ipcount1.open("iplist.txt");
Ipstruct *iplist = new Ipstruct[ipnum];//已经delete了
for (int i = 0; i < ipnum; i++)
{
getline(ipcount1, iplist[i]._ipaddress);
}
ipcount1.close();
/*cout << "已去重ip列表读取情况" << endl;
for (int i = 0; i < ipnum; i++)
{
cout << iplist[i]._ipaddress << endl;
}*/
//第三部分 读取原始ip+次数 的数据,存到结构体数组里
ifstream rawattacklist;
rawattacklist.open("rawattacklist.txt");
string rawline;
//cout << "原始列表读取情况" << endl;
while (getline(rawattacklist, rawline))//读取一行 ip+次数
{
int Tabindex = 65534;
string nowip = "";
long long int nowtimes;
for (int i = 0; i < rawline.size(); i++)
{
if (int(rawline[i]) == 9)//9是tab键的ascii码值,是excel复制出来的两行之间的分隔符
{
Tabindex = i;//空格开始的位置
break;
}
}
//cout << "tab键的位置是" << Tabindex<<endl;
nowip = rawline.substr(0,Tabindex);
nowtimes = atoi(rawline.substr(Tabindex+1).c_str());
//cout << nowip << " "<<nowtimes<<endl;
combine(iplist, ipnum, nowip, nowtimes);
}
showAndSaveresult(iplist, ipnum);//在控制台打印结果
delete[] iplist;
rawattacklist.close();
return 0;
}
void combine(Ipstruct *iplist,const long long int ipnum, string ip, long long int times)//把次数times计数到ip相同的结构体里
{
for (int i = 0; i < ipnum; i++)
{
if (ip == iplist[i]._ipaddress)
{
iplist[i]._total = iplist[i]._total + times;
//cout << iplist[i]._ipaddress << "当前计数结果为" << iplist[i]._total << endl;
}
}
}
void showAndSaveresult(const Ipstruct *iplist, const long long ipnum)//输出结构体数组的结果
{
ofstream resulttxt;
resulttxt.open("latestResult.txt");
cout << "统计结果"<< endl;
for (int i = 0; i < ipnum; i++)
{
cout << iplist[i]._ipaddress << '\t' << iplist[i]._total << endl;
resulttxt << iplist[i]._ipaddress << '\t' << iplist[i]._total << endl;
}
resulttxt.close();
}