其实手机号码归属地查询程序比较简单。目前我用的方法是直接查询数据库中的记录。不知道有没有更好的方法。我一直用的是linux系统,所以用的语言也就那么几种。这里我就C语言写个演示的程序,只包含13几的数据库,没有15几的数据库,所以代码中没有考虑那些15几的号码。没有任何技术含量。代码如下。
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
struct telephone_number_info
{
char *number_tag;
char *province;
char *city;
char *region_number;
char *type;
};
int get_telephone_number_info( FILE *stream, const char *number,struct telephone_number_info* info)
{
char number_tag[32];
char province[64];
char city[64];
char type[64];
char region_number[32];
char *hdr = NULL;
char *position;
struct stat sb;
int fd;
/*int flag=0;
char buffer[128];*/
fd=fileno(stream);
fstat(fd,&sb);
hdr=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);
if(hdr== MAP_FAILED) /*判断是否映射成功*/
{
return 0;
}
if((position=strstr(hdr,number))!=NULL)
{
bzero(number_tag,32);
bzero(province,64);
bzero(city,64);
bzero(type,64);
bzero(region_number,32);
sscanf(position,"%s %s %s %s %s",number_tag,province,city,type,region_number);
info->number_tag=strdup(number_tag);
info->province=strdup(province);
info->city=strdup(city);
info->region_number=strdup(region_number);
info->type=strdup(type);
munmap(hdr,sb.st_size);
return 1;
}
else
{
munmap(hdr,sb.st_size);
return 0;
}
/*while((feof(stream)==0)&&(fgets(buffer,128,stream)!=NULL))
{
sscanf(buffer,"%s %s %s %s %s",number_tag,province,city,type,region_number);
if(strcmp(number_tag,number)==0)
{
flag=1;
break;
}
}
if(flag==1)
{
info->number_tag=strdup(number_tag);
info->province=strdup(province);
info->city=strdup(city);
info->region_number=strdup(region_number);
info->type=strdup(type);
}
return flag;*/
}
int main(int argc,char *argv[])
{
FILE *fp;
char *text_addr=NULL;
int ret;
struct telephone_number_info info;
char telephone_head[8];
char *telephone_number;
char filename[]="./telephone.txt";
char test[32];
strcpy(test,argv[1]);
telephone_number=test;
if(strlen(telephone_number)<7)
{
printf("输入错误的手机号码/n");
return 0;
}
else
{
strncpy(telephone_head,telephone_number,7);
telephone_head[7]='/0';
}
fp=fopen(filename,"r+");
if(fp==NULL)
{
printf("打开数据库文件失败/n");
return 0;
}
ret=get_telephone_number_info(fp,telephone_head,&info);
if(ret==1)
{
printf("/t手机号码:%s/n/t省份:%s/n/t城市:%s/n/t区号:%s/n/t手机卡类型:%s/n", telephone_number,info.province,info.city,info.region_number,info.type);
}
else
{
printf("没有找到该号码所在地区/n");
}
fclose(fp);
}
需要数据库文件的可以和我联系。也没啥,网上都有,只是txt的比较少。好不容易把xls的转为txt.
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
struct telephone_number_info
{
char *number_tag;
char *province;
char *city;
char *region_number;
char *type;
};
int get_telephone_number_info( FILE *stream, const char *number,struct telephone_number_info* info)
{
char number_tag[32];
char province[64];
char city[64];
char type[64];
char region_number[32];
char *hdr = NULL;
char *position;
struct stat sb;
int fd;
/*int flag=0;
char buffer[128];*/
fd=fileno(stream);
fstat(fd,&sb);
hdr=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);
if(hdr== MAP_FAILED) /*判断是否映射成功*/
{
return 0;
}
if((position=strstr(hdr,number))!=NULL)
{
bzero(number_tag,32);
bzero(province,64);
bzero(city,64);
bzero(type,64);
bzero(region_number,32);
sscanf(position,"%s %s %s %s %s",number_tag,province,city,type,region_number);
info->number_tag=strdup(number_tag);
info->province=strdup(province);
info->city=strdup(city);
info->region_number=strdup(region_number);
info->type=strdup(type);
munmap(hdr,sb.st_size);
return 1;
}
else
{
munmap(hdr,sb.st_size);
return 0;
}
/*while((feof(stream)==0)&&(fgets(buffer,128,stream)!=NULL))
{
sscanf(buffer,"%s %s %s %s %s",number_tag,province,city,type,region_number);
if(strcmp(number_tag,number)==0)
{
flag=1;
break;
}
}
if(flag==1)
{
info->number_tag=strdup(number_tag);
info->province=strdup(province);
info->city=strdup(city);
info->region_number=strdup(region_number);
info->type=strdup(type);
}
return flag;*/
}
int main(int argc,char *argv[])
{
FILE *fp;
char *text_addr=NULL;
int ret;
struct telephone_number_info info;
char telephone_head[8];
char *telephone_number;
char filename[]="./telephone.txt";
char test[32];
strcpy(test,argv[1]);
telephone_number=test;
if(strlen(telephone_number)<7)
{
printf("输入错误的手机号码/n");
return 0;
}
else
{
strncpy(telephone_head,telephone_number,7);
telephone_head[7]='/0';
}
fp=fopen(filename,"r+");
if(fp==NULL)
{
printf("打开数据库文件失败/n");
return 0;
}
ret=get_telephone_number_info(fp,telephone_head,&info);
if(ret==1)
{
printf("/t手机号码:%s/n/t省份:%s/n/t城市:%s/n/t区号:%s/n/t手机卡类型:%s/n", telephone_number,info.province,info.city,info.region_number,info.type);
}
else
{
printf("没有找到该号码所在地区/n");
}
fclose(fp);
}
需要数据库文件的可以和我联系。也没啥,网上都有,只是txt的比较少。好不容易把xls的转为txt.