加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

电子地图管理系统---二进制文件的读取(C语言)

(2010-01-15 22:54:27)
标签:

二进制

c

读取

校园

分类: 我的原创


#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;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有