#include "macro.h"
static UINT4 count = 1;
void Show(RoadInfor *proadInfor)
{
if(NULL == proadInfor->roadName)
{
printf("#linkid=%d;roadnameflag=%d;brunch=%d;dispclass=%d#/n",
MC_GET_LONG(proadInfor->linkID),proadInfor->nodeInfor.flag,
proadInfor->nodeInfor.brunch,proadInfor->nodeInfor.dispclass);
}
else
{
printf("#linkid=%d;roadnameflag=%d;brunch=%d;dispclass=%d;roadname=%s#/n",
MC_GET_LONG(proadInfor->linkID),proadInfor->nodeInfor.flag,proadInfor->nodeInfor.brunch,
proadInfor->nodeInfor.dispclass,proadInfor->roadName+4);
}
return;
}
//计算字符串长度
UINT4 StringLenth(const char* pch)
{
UINT4 n = 0;
while(*pch != '/0' && *pch != '/n')//fgets中输入的名称中也接收了回车/n,所以对于输入的数据只算到 /n 之前的长度
{
pch++;
n++;
}
return n;
}
//比较两个字符串大小
UINT1 StringComepare(const char* pch1, const char* pch2)
{
if(StringLenth(pch1) == StringLenth(pch2))
{
while(*pch1 != '/0')
{
if(*pch1 != *pch2)
{
break;
}
pch1++;
pch2++;
}
return 0;
}
return 1;
}
//指定linkID检索,返回值中有负值,所以定义为int类型
int CheckLinkID(RoadInfor roadInfor[],UINT4 first,UINT4 last,UINT4 num,UINT4 linkID)
{
RoadInfor left = roadInfor[first],right = roadInfor[last-1],middle = roadInfor[last/2];
if(linkID < MC_GET_LONG(roadInfor[0].linkID))
{
return -1;
}
if(linkID > MC_GET_LONG(roadInfor[num-1].linkID))
{
return -2;
}
if(linkID < MC_GET_LONG(left.linkID) || linkID > MC_GET_LONG(right.linkID))
{
printf("没有对应linkID为%d的记录!/n",linkID);
printf("/n按键继续...");
getch();
if(linkID < MC_GET_LONG(left.linkID))
{
return first;
}
else
{
return last;
}
}
if(MC_GET_LONG(left.linkID) == linkID)
{
Show(&left);
printf("/n按键继续...");
getch();
return first;
}
if(MC_GET_LONG(right.linkID) == linkID)
{
Show(&right);
printf("/n按键继续...");
getch();
return last;
}
if(MC_GET_LONG(middle.linkID) == linkID)
{
Show(&middle);
printf("/n按键继续...");
getch();
return last/2;
}
if(linkID > MC_GET_LONG(left.linkID) && linkID < MC_GET_LONG(middle.linkID))
{
last = (first+last)/2;
if((last-first)==1)
{
return last;
}
CheckLinkID(roadInfor,first,last,num,linkID);
}
if(linkID < MC_GET_LONG(right.linkID) && linkID > MC_GET_LONG(middle.linkID))
{
first = (first+last)/2;
if((last-first)==1)
{
return last;
}
CheckLinkID(roadInfor,first,last,num,linkID);
}
}
//获取每次的text文件名称
void GetTxtPath(char* path, UINT4 count)
{
UINT2 counter = count%1000;
char ch[7]={0,0,0,'.','t','x','t'};
ch[0] = (counter/100)%1 + '0';
ch[1] = (counter/10)%10 + '0';
ch[2] = counter%100 + '0';
strncat(path,ch,7);
}
//将数据写入text文件
void WriteTxt(RoadInfor *proadInfor, UINT4 n, FILE *fp)
{
UINT4 i = 0;
UINT4 linkID = 0;//linkID的值
while( i < n)
{
linkID = MC_GET_LONG(proadInfor->linkID);//计算linkID的值
if(proadInfor->roadName!=NULL)//有道路名称则写入
{
fprintf(fp,"#linkid=%d;roadnameflag=%d;brunch=%d;dispclass=%d;roadname=%s#/n",
linkID, proadInfor->nodeInfor.flag, proadInfor->nodeInfor.brunch,
proadInfor->nodeInfor.dispclass,(proadInfor->roadName+4));//+4是为了去掉字符'1 = ',只显示道路名称
}
else//否则去掉该项
{
fprintf(fp,"#linkid=%d;roadnameflag=%d;brunch=%d;dispclass=%d#/n",
linkID, proadInfor->nodeInfor.flag, proadInfor->nodeInfor.brunch,
proadInfor->nodeInfor.dispclass);
}
proadInfor++;
i++;
}
return;
}
//指定交叉Link列表示Class番号 检索
void CheckDispClass(RoadInfor roadInfor[], UINT4 num, UINT4 dispClass)
{
UINT4 i = 0;
UINT1 counter = 0;
FILE *fp;
RoadInfor localRoadInfor[6];
char path[20] = "searchresult";
while(i < num && counter < 6)
{
if(dispClass == roadInfor[i].nodeInfor.dispclass)
{
localRoadInfor[counter] = roadInfor[i];
Show(&roadInfor[i]);
counter++;
}
i++;
}
if(counter == 0)
{
printf("没有符合您输入条件的数据!/n");
}
//记录数大于5个时,写入文件
if( counter > 5)
{
GetTxtPath(path,count);
if(NULL==(fp=fopen(path,"w+")))
{
printf("打开文件失败!/n");
return;
}
WriteTxt(localRoadInfor,6,fp);
while(i < num)
{
if(dispClass == roadInfor[i].nodeInfor.dispclass)
{
Show(&roadInfor[i]);
WriteTxt(&roadInfor[i],1,fp);
}
i++;
}
fclose(fp);
}
printf("/n按键继续...");
getch();
count++;
}
//指定查找岔路数 检索
void CheckBrunch(RoadInfor roadInfor[],UINT4 num,UINT4 brunch)
{
UINT4 i = 0;
UINT1 counter = 0;
FILE *fp = NULL;
RoadInfor localRoadInfor[6];
char path[20] = "searchresult";
while(i < num && counter < 6)
{
if(roadInfor[i].nodeInfor.brunch > brunch)
{
localRoadInfor[counter] = roadInfor[i];
Show(&roadInfor[i]);
counter++;
}
i++;
}
if(counter == 0)
{
printf("没有符合您输入条件的数据!/n");
}
if( counter > 5)
{
GetTxtPath(path, count);
if(NULL==(fp=fopen(path,"w+")))
{
printf("文件打开失败!/n");
return;
}
WriteTxt(localRoadInfor,6,fp);
while(i < num)
{
if(roadInfor[i].nodeInfor.brunch > brunch)
{
Show(&roadInfor[i]);
WriteTxt(&roadInfor[i],1,fp);
}
i++;
}
fclose(fp);
}
printf("/n按键继续...");
getch();
count++;
}
//指定道路名称 检索
void CheckRoadName(RoadInfor roadInfor[], UINT4 num, char roadName[40])
{
UINT4 i = 0;
UINT1 counter = 0;
FILE *fp = NULL;
RoadInfor localRoadInfor[6];
char path[20] = "searchresult";
while(i < num && counter < 6)
{
if(roadInfor[i].roadName!=NULL)
{
if(StringComepare((roadInfor[i].roadName+4),roadName) == 0)
{
localRoadInfor[counter] = roadInfor[i];
Show(&roadInfor[i]);
counter++;
}
}
i++;
}
if(counter == 0)
{
printf("没有符合您输入条件的数据!/n");
}
if( counter > 5)
{
GetTxtPath(path,count);
if(NULL==(fp=fopen(path,"w+")))
{
printf("文件打开失败!/n");
return;
}
WriteTxt(localRoadInfor,6,fp);
while(i < num)
{
if(roadInfor[i].roadName!=NULL)
{
if(strcmp(roadInfor[i].roadName,roadName) == 0)
{
Show(&roadInfor[i]);
WriteTxt(&roadInfor[i],1,fp);
}
}
i++;
}
fclose(fp);
}
printf("/n按键继续...");
getch();
count++;
}