我有一个10次点击的日志文件,例如一行是:
127.0.0.1 - - [10/Oct/2007:13:55:36 0700]"GET /index.html HTTP/1.0" 200 2326 "http://www.example.com/links.html" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)"
每行的格式相同,即IP地址始终在开头。
我目前正在使用fopen和fgets读取文件,但现在我想计算文件中有多少个唯一的IP,以及计算IP'点击的次数。 。我不确定如何尝试这个...有关我将如何做这个的任何提示?
答案 0 :(得分:2)
代码可以通过文件查找ddd.ddd.ddd.ddd模式。
避免使用"%d"
或"%u"
,因为他们接受前导空格,'-'
和'+'
。
伪代码
Read from a file until EOF found
repeatedly look for a digit
if it is found
note position
put digit back into stream
look for ddd.ddd.ddd.ddd
if found
decode (and test for values > 255)
if successful return result
go back to position
return fail value;
示例代码。还应该进行IO错误检查。
unsigned long Parse_IP(FILE *inf) {
int ch;
for ((ch = fgetc(inf)) != EOF) {
if (isdigit(ch)) {
long pos = ftell(inf);
ungetc(ch, inf);
char buf[4][4];
int count = fscanf(inf, "%3[0-9].%3[0-9].%3[0-9].%3[0-9]",
buf[0], buf[1], buf[2], buf[3]);
if (count == 4) {
unsigned long ip = 0;
int i;
for (i=0; i<4; i++) {
int digit = atoi(buf[i]);
if (digit > 255) break;
ip = ip*256 + digit;
}
if (i == 4) return ip;
}
fseek(inf, pos, SEEK_SET);
}
}
return 0;
}
样本用法
unsigned long ip;
while ((ip = Parse_IP(inf)) != 0) {
printf("ip %08lX\n", ip);
}