c++ 之ip+告警统计代码

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();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值