各位大侠来帮帮忙吧,感谢!!

时间:2022-09-05 21:18:23
有两个文本文件,一个是由IP地址组成的边,如:
2000:2201:3081:7::1,2000:2201:3081:7::2
2000:2201:3081:7::2,2000:2201:3081:7::1
2001:1228:10a:813::1,2001:1228:10a:f13::1
2001:1228:10a:f02::1,2001:1228:10a:f09::2
2001:1228:10a:f02::2,2001:1228:11a:201::2
2001:1228:10a:f02::2,2001:1228:11e:202::2
2001:1228:10a:f09::2,2001:1228:11a:90a::2
2001:1228:10a:f09::2,2001:1228:11b:90a::2
2001:1228:10a:f13::1,2001:1228:10a:f02::2
2001:1228:10a:f13::1,2001:1228:10a:f09::2
另一个文本文件是每一个IP地址对应的一个值,如:
2000:2201:3081:7::1 2
2000:2201:3081:7::2 2
2001:1228:10a:813::1 2
2001:1228:10a:f13::1 2
2001:1228:10a:f02::1 2
2001:1228:10a:f09::2 2
2001:1228:10a:f02::2 2
2001:1228:11a:201::2 2
2001:1228:11e:202::2 2
2001:1228:11a:90a::2 1
2001:1228:11b:90a::2 2
2001:1291:0:2::b     3
2001:1291:0:4::b          3
2001:1291:0:5::b      3
目的是用IP地址对应的值代替第一个文件里的IP地址,如:
2  2
2  2
2  2
2  2
2  2
2  2
2  1
。。。。(当然这里的文件不是全的)
说白了就是用IP地址对应的值代替第一个文本文档的IP地址(还是两两对应的形式),用C++编写


18 个解决方案

#1


第一个文件中IP地址跟谁对应的?意思都没表达清除。而且这是IP地址么,没有这样的IP地址吧,不是IPv4也不是IPv6,直接说字符串行了。

#2


引用 1 楼 cattycat 的回复:
第一个文件中IP地址跟谁对应的?意思都没表达清除。而且这是IP地址么,没有这样的IP地址吧,不是IPv4也不是IPv6,直接说字符串行了。

大哥,这是ipv6的,第一个文件是两个ipv6地址组成的边(两两对应的边),帮帮忙,多谢

#3


引用 1 楼 cattycat 的回复:
第一个文件中IP地址跟谁对应的?意思都没表达清除。而且这是IP地址么,没有这样的IP地址吧,不是IPv4也不是IPv6,直接说字符串行了。

第二个文件里前面是一个IP地址,后面对应一个数值,仔细看看最后是一个数字,是我排版部清楚

#4


自己顶。。!!!!

#5


楼主可以创建一个IPV6结构体的链表,用来存放ipv6的字符串和计数值,假设是以空格作为分隔符的,第一次找到一个后直接加入链表组,以后每找到一个就盒已加入的依次比较,如果找到相同的,则将该ipv6字符串的计数值加一,否则加入数组尾部,完成后,可以再根据需要进行排序,不知楼主是这个意思不?
struct IPV6
{
char cIp[50];
int nCount;
};

#6


顶起顶起顶起

#7





#include "stdio.h"
#include "stdlib.h"
#include "memory.h"
#include <string.h>



typedef struct iptab
{
char ip[50];
int val;
iptab* next;
}* piptab;
 
piptab readiptab()
{
FILE *f1;
piptab t, h = NULL;

f1 = fopen("d:\\1.txt", "r");
if(!f1) 
{
printf("not find ip table file.\n");
return NULL;
};
fseek(f1, 0, SEEK_SET);
while(!feof(f1))
{
t = (piptab)malloc(sizeof(iptab));
memset(t, 1, sizeof(iptab));
fscanf(f1, "%s %d", t->ip, &t->val);
if(h)
{
t->next = h;
h = t;
}
else
{
h = t;
t->next = NULL;
};
};
fclose(f1);
return h;
};

int getipval(piptab tab, char* ip)
{
while(tab)
{
if(!strcmp(ip, tab->ip))
{
return tab->val;
}
tab = tab->next;
};
return 0;
};


void main()
{
FILE* f;
piptab ftab;
char ip1[50], ip2[50];

ftab = readiptab();
if(!ftab) return;

f = fopen("d:\\2.txt", "r");
if(!f) 
{
printf("not find ip data file.\n");
return;
};
fseek(f, 0, SEEK_SET);
while(!feof(f))
{
memset(ip1, 1, 50);
memset(ip2, 1, 50);
fscanf(f, "%[^,],%s\n", ip1, ip2);
  printf("%d %d\n", getipval(ftab, ip1), getipval(ftab, ip2));
};
fclose(f);
}



放在d:\下
1.txt ip地址和数值表
2.txt 要处理的ip文件

文件里不能有其他特殊符号。

#8


引用 7 楼 findcsdn 的回复:

编译链接都没问题,但是运行时出现“0x7c931980”指令引用的“0x00000000”内存,该内存不能为“read”错误,这是为什么啊

#9


读第二个文件到map中,map<string,int>,第一个key表示IP,第二个表示对应的值。
然后读取第一个文件,每次读取一行到string中,然后以逗号分隔符隔开,在map中找到对应的IP,重新输出对应的int值就可以了。这样算比较简单了,map用法就是insert和find了。

#10


我是vc6 测试没有问题的,结果也对。
你自己调试一下吧,也许文件格式的问题,也许文件路径的问题。


#11


引用 10 楼 findcsdn 的回复:
我是vc6 测试没有问题的,结果也对。
你自己调试一下吧,也许文件格式的问题,也许文件路径的问题。

但是就是不行呢,呜呜。。。一运行就会出错,是vC6的问题吗?

#12


路过接分

#13


我刚才又试了下,代码是上面考的,测试数据也是网页上拷贝的。
测试结果还是好的,你调试一下, 看看是什么错误!

#14


引用 9 楼 cattycat 的回复:
读第二个文件到map中,map<string,int>,第一个key表示IP,第二个表示对应的值。
然后读取第一个文件,每次读取一行到string中,然后以逗号分隔符隔开,在map中找到对应的IP,重新输出对应的int值就可以了。这样算比较简单了,map用法就是insert和find了。

正解

#15


引用 13 楼 findcsdn 的回复:
我刚才又试了下,代码是上面考的,测试数据也是网页上拷贝的。
测试结果还是好的,你调试一下, 看看是什么错误!

我找到是什么错误了,因为我运行程序时的文件很大,而程序里的数组定义了50,所以就会出错。但是弱弱的问一句,怎么还是没结果呢,只有一个press any key to continue

#16


引用 14 楼 zhao4zhong1 的回复:
正解

帮忙写一个用map的吧,多谢了

#17



你这样子真没人愿意帮你, 一点都不动脑筋。

跟50的关系不大吧,我用的是链表,多大数据都可以。
你先用测试数据试一下,如果没有结果调换两个文件的名字。

#18


引用 17 楼 findcsdn 的回复:
你这样子真没人愿意帮你, 一点都不动脑筋。

跟50的关系不大吧,我用的是链表,多大数据都可以。
你先用测试数据试一下,如果没有结果调换两个文件的名字。

多谢啊,我也不是没动脑子就是能力有限吧,怎么也没想到是两个文件名的问题,还以为您会按上面的定义1和2文件呢,没想到你这样定义的,但是我真的就是把50改成50000后,运行就没问题了,也不知道这是什么原因,多谢

#1


第一个文件中IP地址跟谁对应的?意思都没表达清除。而且这是IP地址么,没有这样的IP地址吧,不是IPv4也不是IPv6,直接说字符串行了。

#2


引用 1 楼 cattycat 的回复:
第一个文件中IP地址跟谁对应的?意思都没表达清除。而且这是IP地址么,没有这样的IP地址吧,不是IPv4也不是IPv6,直接说字符串行了。

大哥,这是ipv6的,第一个文件是两个ipv6地址组成的边(两两对应的边),帮帮忙,多谢

#3


引用 1 楼 cattycat 的回复:
第一个文件中IP地址跟谁对应的?意思都没表达清除。而且这是IP地址么,没有这样的IP地址吧,不是IPv4也不是IPv6,直接说字符串行了。

第二个文件里前面是一个IP地址,后面对应一个数值,仔细看看最后是一个数字,是我排版部清楚

#4


自己顶。。!!!!

#5


楼主可以创建一个IPV6结构体的链表,用来存放ipv6的字符串和计数值,假设是以空格作为分隔符的,第一次找到一个后直接加入链表组,以后每找到一个就盒已加入的依次比较,如果找到相同的,则将该ipv6字符串的计数值加一,否则加入数组尾部,完成后,可以再根据需要进行排序,不知楼主是这个意思不?
struct IPV6
{
char cIp[50];
int nCount;
};

#6


顶起顶起顶起

#7





#include "stdio.h"
#include "stdlib.h"
#include "memory.h"
#include <string.h>



typedef struct iptab
{
char ip[50];
int val;
iptab* next;
}* piptab;
 
piptab readiptab()
{
FILE *f1;
piptab t, h = NULL;

f1 = fopen("d:\\1.txt", "r");
if(!f1) 
{
printf("not find ip table file.\n");
return NULL;
};
fseek(f1, 0, SEEK_SET);
while(!feof(f1))
{
t = (piptab)malloc(sizeof(iptab));
memset(t, 1, sizeof(iptab));
fscanf(f1, "%s %d", t->ip, &t->val);
if(h)
{
t->next = h;
h = t;
}
else
{
h = t;
t->next = NULL;
};
};
fclose(f1);
return h;
};

int getipval(piptab tab, char* ip)
{
while(tab)
{
if(!strcmp(ip, tab->ip))
{
return tab->val;
}
tab = tab->next;
};
return 0;
};


void main()
{
FILE* f;
piptab ftab;
char ip1[50], ip2[50];

ftab = readiptab();
if(!ftab) return;

f = fopen("d:\\2.txt", "r");
if(!f) 
{
printf("not find ip data file.\n");
return;
};
fseek(f, 0, SEEK_SET);
while(!feof(f))
{
memset(ip1, 1, 50);
memset(ip2, 1, 50);
fscanf(f, "%[^,],%s\n", ip1, ip2);
  printf("%d %d\n", getipval(ftab, ip1), getipval(ftab, ip2));
};
fclose(f);
}



放在d:\下
1.txt ip地址和数值表
2.txt 要处理的ip文件

文件里不能有其他特殊符号。

#8


引用 7 楼 findcsdn 的回复:

编译链接都没问题,但是运行时出现“0x7c931980”指令引用的“0x00000000”内存,该内存不能为“read”错误,这是为什么啊

#9


读第二个文件到map中,map<string,int>,第一个key表示IP,第二个表示对应的值。
然后读取第一个文件,每次读取一行到string中,然后以逗号分隔符隔开,在map中找到对应的IP,重新输出对应的int值就可以了。这样算比较简单了,map用法就是insert和find了。

#10


我是vc6 测试没有问题的,结果也对。
你自己调试一下吧,也许文件格式的问题,也许文件路径的问题。


#11


引用 10 楼 findcsdn 的回复:
我是vc6 测试没有问题的,结果也对。
你自己调试一下吧,也许文件格式的问题,也许文件路径的问题。

但是就是不行呢,呜呜。。。一运行就会出错,是vC6的问题吗?

#12


路过接分

#13


我刚才又试了下,代码是上面考的,测试数据也是网页上拷贝的。
测试结果还是好的,你调试一下, 看看是什么错误!

#14


引用 9 楼 cattycat 的回复:
读第二个文件到map中,map<string,int>,第一个key表示IP,第二个表示对应的值。
然后读取第一个文件,每次读取一行到string中,然后以逗号分隔符隔开,在map中找到对应的IP,重新输出对应的int值就可以了。这样算比较简单了,map用法就是insert和find了。

正解

#15


引用 13 楼 findcsdn 的回复:
我刚才又试了下,代码是上面考的,测试数据也是网页上拷贝的。
测试结果还是好的,你调试一下, 看看是什么错误!

我找到是什么错误了,因为我运行程序时的文件很大,而程序里的数组定义了50,所以就会出错。但是弱弱的问一句,怎么还是没结果呢,只有一个press any key to continue

#16


引用 14 楼 zhao4zhong1 的回复:
正解

帮忙写一个用map的吧,多谢了

#17



你这样子真没人愿意帮你, 一点都不动脑筋。

跟50的关系不大吧,我用的是链表,多大数据都可以。
你先用测试数据试一下,如果没有结果调换两个文件的名字。

#18


引用 17 楼 findcsdn 的回复:
你这样子真没人愿意帮你, 一点都不动脑筋。

跟50的关系不大吧,我用的是链表,多大数据都可以。
你先用测试数据试一下,如果没有结果调换两个文件的名字。

多谢啊,我也不是没动脑子就是能力有限吧,怎么也没想到是两个文件名的问题,还以为您会按上面的定义1和2文件呢,没想到你这样定义的,但是我真的就是把50改成50000后,运行就没问题了,也不知道这是什么原因,多谢