文件阅读有问题?

时间:2011-03-11 15:51:15

标签: c++ c unix programming-languages

typedef long int INT;
typedef unsigned char byte;

#define MAX_CITIES (INT)2.7e6
#define MAX_LEN (int)1e6

typedef struct
{
    unsigned long start;
    unsigned long end;
    char *region;
    char *city;
    char *type;
} ipdb;

ipdb db;
char s[MAX_LEN + 1];


typedef struct
{
    unsigned long start;
    unsigned long end;
    char *region;
    char *city;
    char *type;
} ipdb;

ipdb db;    
void search( unsigned long ip )
{
    FILE *F;
    char * pch;
    long i = 0;
    F = fopen("cidr_ru_slave_index.db", "rt");
    while (fgets(s, MAX_LEN, F))
    {
        trim_end(s);
        pch = strtok (s, "\t");
        i = 0;
        while (pch != NULL)
        {
            switch(i)
            {
                case 0:
                    db.start = atoi(pch);
                break;

                case 1:
                    db.end = atoi(pch);
                break;

                case 4:
                    db.city = pch;
                break;

                case 5:
                    db.region = pch;
                break;

                case 8:
                    db.type = pch;
                break;
            }
            pch = strtok (NULL, "\t");
            i++;
        }

        if(ip >= db.start && ip <= db.end)
        {
            printf("Match\n");
        }
    }
}

cidr_ru_slave_index.db如下所示:

37486592    37494783    2.60.0.0 - 2.60.31.255  RU  Омск    Омская область  Сибирский   ASSIGNED PA
37494784    37502975    2.60.32.0 - 2.60.63.255 RU  Омск    Омская область  Сибирский   ASSIGNED PA
37502976    37511167    2.60.64.0 - 2.60.95.255 RU  Омск    Омская область  Сибирский   ASSIGNED PA
37511168    37519359    2.60.96.0 - 2.60.127.255    RU  Омск    Омская область  Сибирский   ASSIGNED PA
37519360    37527551    2.60.128.0 - 2.60.159.255   RU  Омск    Омская область  Сибирский   ASSIGNED PA
...
3653754624  3653754879  217.199.223.0 - 217.199.223.255 RU  Москва  Москва  Центральный ASSIGNED PA
3653758976  3653760255  217.199.240.0 - 217.199.244.255 RU  Екатеринбург    Свердловская область    Уральский   ASSIGNED PA
3653759488  3653759503  217.199.242.0 - 217.199.242.15  RU  Екатеринбург    Свердловская область    Уральский   ASSIGNED PA
3653759520  3653759551  217.199.242.32 - 217.199.242.63 RU  Екатеринбург    Свердловская область    Уральский   ASSIGNED PA
3653759520  3653759535  217.199.242.32 - 217.199.242.47 RU  Екатеринбург    Свердловская область    Уральский   ASSIGNED PA
3653762560  3653762815  217.199.254.0 - 217.199.254.255 RU  Екатеринбург    Свердловская область    Уральский   ASSIGNED PA

文件大小为14718KB,读取正常(在

之后添加printf(“%u \ n”,db.start)
}
                pch = strtok (NULL, "\t");
                i++;
            }

输出所有文件)。但是扫描ip地址有问题(如果(ip&gt; = db.start&amp;&amp; ip&lt; = db.end)),文件的前半部分没问题,但是在上半年之后没有任何结果,为什么?

PS OS - gnu / linux PSS对不起我的英文:D

1 个答案:

答案 0 :(得分:8)

2 ^ 31及更高的值超出了atoi可以处理的范围,它将为它们返回INT_MAX。您可以改为使用strtoul