C语言实训电子地图导航系统源代码.docx
《C语言实训电子地图导航系统源代码.docx》由会员分享,可在线阅读,更多相关《C语言实训电子地图导航系统源代码.docx(26页珍藏版)》请在冰豆网上搜索。
![C语言实训电子地图导航系统源代码.docx](https://file1.bdocx.com/fileroot1/2023-4/21/3e17f8e2-d450-440f-8459-9f8965b188d7/3e17f8e2-d450-440f-8459-9f8965b188d71.gif)
C语言实训电子地图导航系统源代码
/**************************************************************************************
*Filename:
tagMap_tDo.cpp*
*Created:
2012/6/24*
*Author:
..吴昊王洋张伟王伟*
**************************************************************************************/
#include
#include
#include
#include
/*函数声明部分*/
voidma_interf();
intReadFile();
voidReadData(FILE*p);
voidWriteResult(intb[],intj);
voidSearch();
/*宏定义*/
#defineMCGETCHAR(data)(*((char*)(data)))
#defineMCGETSHORT(data)((unsignedshort)((((unsignedshort)(*((char*)(data))))<<8)|(((unsignedshort)(*((char*)(data)+1)))&0x00ff)))
#defineMCGETLONG(data)((((unsignedlong)MCGETSHORT((data)))<<16)|(((unsignedlong)MCGETSHORT((char*)(data)+2))&0x0000ffff))
#defineMCGET3BN(data)((((unsignedlong)MCGETCHAR((data)))<<16)|(((unsignedlong)MCGETSHORT((char*)(data)+1))&0x0000ffff))
#defineLength655350
intnsizecount=2;
/*定义结构体类型及变量*/
structRoadRecord
{
shortussize;
longullinkId;
shortusroadnamesize;
intusdispclass;
intusbrunch;
intusroadnameflag;
charroadname[20];
};
structtagMap_t
{
charsign_one[2];
charlinkid[14];
charflag[7];
charbrunch[9];
chardispclass[13];
charRoadname[30];
charsign_two[2];
}*s,*ss;
intmark_1=0,mark_2=0;//标记程序是否运行读取文件和排序操作
voidSortData(tagMap_ts[]);
voidUpdate(tagMap_ts[]);
structdataOut
{longlinkId;
intdispclass;
intbrunch;
introadnameflag;
};
structRoadRecordroad[Length];
structdataOutdata[Length];/*存储道路信息的数组*/
/**************************************************************************************
*Functionname:
ReadFile*
*FunctionDescription:
读取二进制文件,并将其解析在文本文档里*
*Date:
2012/6/20*
**************************************************************************************/
intReadFile()
{
intm;
characlinkId[4];/*从二进制文件中读取道路编号*/
characroadnamesize[2];/*从二进制文件中读取道路名称数据长度*/
characNodeInfo[4];
unsignedshortustotalsize;
unsignedlongullinkId;
unsignedshortusroadnamesize;
charactotalsize[2];/*从二进制文件中读取道路信息的总体数据长度*/
FILE*pfp=fopen("e:
\\电子地图管理系统.dat","rb+");
FILE*pf2=fopen("e:
\\解析文件.txt","w+");
if(pfp==NULL)
{
printf("cannotopenthe电子地图管理系统.datfileorthereisnothefile!
\n");
return0;
}
if(pf2==NULL)
{
printf("cannotopenthe解析文件.txtfileorthereisnothefile\n");
return0;
}
printf("\n\n\t\t\t\t文件读取中.....\n");
while(fread(actotalsize,sizeof(actotalsize),1,pfp)==1)
{
fread(aclinkId,sizeof(aclinkId),1,pfp);/*读取占用4字节的linkId字符*/
fread(acroadnamesize,sizeof(acroadnamesize),1,pfp);/*读取占用2字节的roadnamesize字符串*/
fread(acNodeInfo,sizeof(acNodeInfo),1,pfp);
ustotalsize=MCGETSHORT(actotalsize);/*调用宏函数,将字符串信息转化为数值类型*/
ullinkId=MCGETLONG(aclinkId);
usroadnamesize=MCGETSHORT(acroadnamesize);
/*赋值:
将数值信息传到结构体中*/
road[nsizecount].ussize=ustotalsize;
road[nsizecount].ullinkId=ullinkId;
road[nsizecount].usroadnamesize=usroadnamesize;
m=(int)acNodeInfo[3]&255;
road[nsizecount].usdispclass=m&15;
road[nsizecount].usbrunch=(m&112)/16;
road[nsizecount].usroadnameflag=(m&128)/128;
data[nsizecount].dispclass=road[nsizecount].usdispclass;
data[nsizecount].brunch=road[nsizecount].usbrunch;
data[nsizecount].roadnameflag=road[nsizecount].usroadnameflag;
data[nsizecount].linkId=ullinkId;
fread(road[nsizecount].roadname,sizeof(char),ustotalsize-12,pfp);/*从文件中读取道路名称*/
fprintf(pf2,"#\t");
fprintf(pf2,"LinkID=");
fprintf(pf2,"%d\t",data[nsizecount].linkId);
fprintf(pf2,"flag=");
fprintf(pf2,"%d\t",data[nsizecount].roadnameflag);
fprintf(pf2,"brunch=");
fprintf(pf2,"%d\t",data[nsizecount].brunch);
fprintf(pf2,"dispclass=");
fprintf(pf2,"%d\t",data[nsizecount].dispclass);
fprintf(pf2,"Roadname=1=");
fprintf(pf2,"%s\t",road[nsizecount].roadname+4);
fprintf(pf2,"#");
fprintf(pf2,"\n");
nsizecount++;
}
fclose(pfp);
fclose(pf2);
printf("\n\t\t\t\t文件读取成功\n");
return0;
}
/**************************************************************************************
*Functionname:
Search*
*FunctionDescription:
检索信息部分,可按不同的类型进行检索*
*Date:
2012/6/20*
**************************************************************************************/
voidSearch()
{
intselect,i=0,j=0,*b,c=0,f;//select标记选择需要运行的分支i循环控制j标记检索到信息的条数
//b数组指针用来存放检索到的信息的下标c用来存放数组b的下标f标记数组b的值
charsss[20];
printf("\n\n\t请输入检索方式:
\n\n\t\t1:
指定linkID检索\n\n\t\t2:
指定交叉link列表示class番号检索\n\n\t\t3:
指定查找岔路数检索\n\n\t\t4:
指定道路名称检索\n\n\t\t0:
返回\n\n\t\t请选择:
");
scanf("%d",&select);
system("cls");
printf("\n\n*****--当检索到信息条数超过5条时,会把检索到的信息存放在searchresult文件中--*****\n\n");
printf("\n********--当检索到信息条数未超过5条时,会把检索到的信息直接显示在屏幕上--********\n\n\n");
if(select==1)
{
charss_1[14]="LinkID=";
printf("\t请输入link的ID:
");
scanf("%s",sss);
system("cls");
strcat(ss_1,sss);//连接字符串
for(i=0;i<(nsizecount-2);i++)
{
if(strcmp(ss_1,ss[i].linkid)==0)//比较字符串是否一致
{
printf("\n\n%s%s%s%s%s%s%s\n\n\n",s[i].sign_one,ss[i].linkid,ss[i].flag,ss[i].brunch,\
ss[i].dispclass,ss[i].Roadname,s[i].sign_two);
j++;
}
}
if(j==0)
{
printf("\n\n\t\t\t\t没有匹配结果\n\n\t\t\t请重新选择检索方式\n");
Search();
}
}
elseif(select==2)
{
charss_1[14]="dispclass=";
printf("\t请输入交叉link列表示class番号:
");
scanf("%s",sss);
system("cls");
strcat(ss_1,sss);//连接字符串
for(i=0;i<(nsizecount-2);i++)
{
if(strcmp(ss_1,ss[i].dispclass)==0)//比较字符串是否一致
{
j++;
}
}
b=(int*)malloc(sizeof(int)*j);//动态申请数组b的存储空间
for(i=0;i<(nsizecount-2);i++)
{
if(strcmp(ss_1,ss[i].dispclass)==0)//比较字符串是否一致
{
b[c]=i;
c++;
}
}
if(j==0)
{
printf("\n\n\t\t\t\t没有匹配结果\n\n\t\t\t请重新选择检索方式\n");
Search();
}
elseif(j>5)
{
WriteResult(b,j);
}
elseif(j<=5)//判断检索到得条数是否超过5条
{
printf("\n\n");
for(i=0;i{
f=b[i];
printf("%s%s%s%s%s%s%s\n",s[f].sign_one,ss[f].linkid,ss[f].flag,ss[f].brunch,\
ss[f].dispclass,ss[f].Roadname,s[f].sign_two);
}
printf("\n\n");
}
free(b);
}
elseif(select==3)
{
charss_1[14]="brunch=";
printf("\t请输入岔路数:
");
scanf("%s",sss);
system("cls");
strcat(ss_1,sss);//连接字符串
for(i=0;i<(nsizecount-2);i++)
{
if(strcmp(ss_1,ss[i].brunch)==0)//比较字符串是否一致
{
j++;
}
}
b=(int*)malloc(sizeof(int)*j);//动态申请数组b的存储空间
for(i=0;i<(nsizecount-2);i++)
{
if(strcmp(ss_1,ss[i].brunch)==0)//比较字符串是否一致
{
b[c]=i;
c++;
}
}
if(j==0)
{
printf("\n\n\t\t\t\t没有匹配结果\n\n\t\t\t请重新选择检索方式\n");
Search();
}
elseif(j>5)
{
WriteResult(b,j);
}
elseif(j<=5)//判断检索到得条数是否超过5条
{
printf("\n\n");
for(i=0;i{
f=b[i];
printf("%s%s%s%s%s%s%s\n",s[f].sign_one,ss[f].linkid,ss[f].flag,ss[f].brunch,\
ss[f].dispclass,ss[f].Roadname,s[f].sign_two);
}
printf("\n\n");
}
free(b);
}
elseif(select==4)
{
charss_1[14]="Roadname=1=";
printf("\t请输入道路名称:
");
scanf("%s",sss);
system("cls");
strcat(ss_1,sss);//连接字符串
for(i=0;i<(nsizecount-2);i++)
{
if(strcmp(ss_1,ss[i].Roadname)==0)//比较字符串是否一致
{
j++;
}
}
b=(int*)malloc(sizeof(int)*j);//动态申请数组b的存储空间
for(i=0;i<(nsizecount-2);i++)
{
if(strcmp(ss_1,ss[i].Roadname)==0)//比较字符串是否一致
{
b[c]=i;
c++;
}
}
if(j==0)
{
printf("\n\n\t\t\t\t没有匹配结果\n\n\t\t\t请重新选择检索方式\n");
Search();
}
elseif(j>5)//判断检索到得条数是否超过5条
{
WriteResult(b,j);
}
elseif(j<=5)
{
printf("\n\n");
for(i=0;i{
f=b[i];
printf("%s%s%s%s%s%s%s\n",s[f].sign_one,ss[f].linkid,ss[f].flag,ss[f].brunch,\
ss[f].dispclass,ss[f].Roadname,s[f].sign_two);
}
printf("\n\n");
}
free(b);
}
elseif(select==0)
{
system("cls");
ma_interf();
}
else//输入不在0到4之间给出提示信息重新返回检索函数
{
system("cls");
printf("\n\n\t\t输入信息错误,请重新选择检索方式\n\n");
Search();
}
ma_interf();//执行结束返回主界面
}
/**************************************************************************************
*Functionname:
WriteResult*
*FunctionDescription:
检索信息,当超过5条时,就将信息写入一个文档中*
*Date:
2012/6/21*
**************************************************************************************/
voidWriteResult(intb[],intj)
{
FILE*qq;
if((qq=fopen("e:
\\searchresult.txt","w"))==NULL)//判断文件是否创建成功
{
printf("创建文件失败\n");
exit(0);
}
inti=0,f;//i为循环控制变量f记录传入数组在不同的i下b[i]的值
printf("\n\n\t\t\t检索到的信息超过--5--条\n\n\n\t\t检索到的信息写入searchresult文件中……\n");
for(i=0;i{
f=b[i];
fprintf(qq,"#\t");
fprintf(qq,"%s\t",ss[f].linkid);//检索到的道路信息写入文件中
fprintf(qq,"%s\t",ss[f].flag);//检索到的道路信息写入文件中