计算IP编号在文本文件中出现的次数 - C程序

时间:2015-11-24 22:53:18

标签: c file-io fopen fgets strncmp

我有一个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'点击的次数。 。我不确定如何尝试这个...有关我将如何做这个的任何提示?

1 个答案:

答案 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);
}