-1

我有一个 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“命中”的次数。不知道我会如何尝试这个..关于我将如何去做的任何提示?

4

1 回答 1

2

代码可以通过文件查找 ddd.ddd.ddd.ddd 模式。

避免使用"%d"or"%u"因为它们接受前导空格,and'-''+'.

伪代码

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);
}
于 2015-11-24T23:34:48.913 回答