#include "Data.h"
//声明全局变量
RoadRecord road[Length]
;
//存储道路信息的数组 ;
int recordsize
;
//记录数组的大小 ;
clock_t start , end
;
//记录程序开始执行和结束执行时的系统时钟
//声明宏函数
#define MCGETCHAR(data) (*((char *)(data)))
#define MCGETSHORT(data) ((unsigned short)((
((unsigned short)(*((char
*)(data))))<<8 )|( ((unsigned
short)(*((char *)(data)+1)))&0x00ff )))
#define MCGETLONG(data) ( ( ((unsigned
long)MCGETSHORT((data)))<<16 )|(
((unsigned long)MCGETSHORT((char
*)(data)+2))&0x0000ffff ) )
#define MCGET3BN(data) ( ( ((unsigned
long)MCGETCHAR((data)))<<16 )|(
((unsigned long)MCGETSHORT((char
*)(data)+1))&0x0000ffff ) )
FILE* FileOpen( char acfilename[] )
{
FILE* pfp ;
while(! ( pfp = fopen( acfilename ,"rb" ) )
) //文件路径无效 ;
{
printf(
"\n\t
给定的文件路径名称无效,是否手动输入路径名(Y/N):" ) ;
char ch ;
while( ( ch = getchar() ) ==
'\n' ) ;
if( 'Y' != ch )
{
//用户拒绝手动输入文件路径 ;
printf("\n\t 程序执行结束 !\n\n")
;
exit(0);
}
else
{
//用户手动输入文件所在的路径 ;
while(ch !=
'\n')
ch = getchar()
;
//读过回车键 ;
printf( "\n\t 输入文件路径名称 :" )
;
scanf( "%s" , acfilename ) ;
}
}
return pfp ;
//返回文件指针 ;
}
int read(char acFilePath[])
{
int nsizecount = 2
;
//结构体数组从第二个位置开始存储数据 ;
FILE* pfp
;
//指针指向二进制文件 ;
char actotalsize[2]
;
//从二进制文件中读取道路信息的总体数据长度 ;
char aclinkId[4]
;
//从二进制文件中读取道路编号 ;
char acroadnamesize[2] ;
//从二进制文件中读取道路名称数据长度;
char acNodeInfo[4]
;
//存储从二进制文件中读取的值 ;
pfp = FileOpen( acFilePath ) ;
//读取文件: 打开原始文件或用户手动输入的文件路径名称 ;
start=clock();
printf("\n\t
读取文件.") ;
printf("\n\t 读取中......")
;
while( 1
)
//循环读取数据,直到pfp指针指向文件的末尾 ;
{
if(
fread( actotalsize , sizeof(actotalsize) , 1 , pfp ) == NULL
)
{
fclose(pfp)
;
end=clock();
printf("\n\t
文件读取成功,用时%f秒\n\n",(double)(end-start)/CLOCKS_PER_SEC);
return
nsizecount-1 ;
}
fread( aclinkId , sizeof(aclinkId) , 1 , pfp )
;
//读取占用4字节的linkId字符串;
fread( acroadnamesize , sizeof(acroadnamesize) ,
1 , pfp ) ;
//读取占用2字节的roadnamesize字符串;
fread( acNodeInfo , sizeof(acNodeInfo) , 1 , pfp
)
;
//读取占用4 字节的dispclass , brunch , 和 roadnameflag字符串 ;
//调用宏函数 , 将字符串信息转化为数值类型 ;
unsigned short ustotalsize = MCGETSHORT( actotalsize ) ;
unsigned long ullinkId = MCGETLONG( aclinkId )
;
unsigned short usroadnamesize
= MCGETSHORT( acroadnamesize ) ;
//赋值 :将数值信息传到结构体中 ;
road[nsizecount].ussize = ustotalsize ;
road[nsizecount].ullinkId = ullinkId ;
road[nsizecount].usroadnamesize= usroadnamesize ;
//从一个字节中读取dispclass , brunch 以及roadnameflag的值 ;
int m=(int)acNodeInfo[3]&255;
road[nsizecount].usdispclass=m&15;
road[nsizecount].usbrunch=(m&112)/16;
road[nsizecount].usroadnameflag=(m&128)/128;
//从文件中读取道路名称 ;
fread( &road[nsizecount].roadname
, sizeof(char) , ustotalsize - 12 , pfp ) ;
nsizecount++;
}
return 0;
}
加载中,请稍候......