文件阅读有问题?

Mar*_*sov 1 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

文件大小为14718KB,读取正常(之后添加printf("%u \n",db.start)

}
                pch = strtok (NULL, "\t");
                i++;
            }
Run Code Online (Sandbox Code Playgroud)

输出所有文件).但是扫描ip地址有问题(if(ip> = db.start && ip <= db.end)),文件的前半部分没问题,但是上半部分没有任何结果,为什么?

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

Gar*_*han 8

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