读入2进制文件 电子地图管理系统

求指点:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct road //定义路的结构体
{
int struct_size; //结构体长度
int LinkID;
int NameSize;
int ClassID;
int Xlu;
int flag;
char name[20];
road()
{
struct_size=0;
LinkID=0;
NameSize=0;
ClassID=0;
Xlu=0;
flag=0;
}
}road[500];

int main()
{

char *pchBuf = NULL;
char *pchBuf1 = NULL;
int nLen = 0,roadnum,i,sum=0; //roadnum记录一共有多少条路,i作为一个计数器,sum与nLen比较,大于等于了就停止。
FILE *pF = fopen("D:\\DATA\\GTBL.dat", "r"); //打开文件

fseek(pF, 0, SEEK_END); //文件指针移到文件尾
nLen = ftell(pF); //得到当前指针位置, 即是文件的长度
rewind(pF); //文件指针恢复到文件头位置

pchBuf = (char*) malloc(sizeof(char)*nLen+1); //动态申请空间, 为保存字符串结尾标志\0, 多申请一个字符的空间
if(!pchBuf)
{
perror("内存不够!\n");
exit(0);
}

nLen = fread(pchBuf, sizeof(char), nLen, pF);//读取文件内容 ,读取的长度和源文件长度有可能有出入,这里自动调整 nLen
pchBuf[nLen] = '\0'; //添加字符串结尾标志
pchBuf1=pchBuf;

for (roadnum=0;sum<nLen;roadnum++)
{
int a[8]={0},num=0;

for (i=0;i<2;i++)
{
road[roadnum].struct_size+=pchBuf[i];
}
pchBuf+=2;

road[roadnum].LinkID+=pchBuf[2]*16*16+pchBuf[3];

pchBuf+=4;
for (i=0;i<2;i++)
{
road[roadnum].NameSize+=pchBuf[i];
}
pchBuf+=2;
/*
i=0;
pchBuf[i]=pchBuf[i+3]+pchBuf[i+2]*16*16;

do
{
a[num]=pchBuf[i+3]%2;
pchBuf[i+3]=pchBuf[i+3]/2;
num++;
} while (((unsigned int)pchBuf[i+3])>=2);

for (i=0;i<4;i++)
{
road[roadnum].ClassID+=a[i];
}
for (i=4;i<7;i++)
{
road[roadnum].Xlu+=a[i];
}
road[roadnum].flag=a[7];
*/
pchBuf+=4;
memcpy(road[roadnum].name,pchBuf,road[roadnum].struct_size-12);
road[roadnum].name[road[roadnum].struct_size-12]='\0';
pchBuf+=road[roadnum].struct_size-12;
sum+=road[roadnum].struct_size;
}

for (i=0;i<roadnum;i++)
{
printf("%d %d %d %d %s\n",road[i].struct_size,road[i].LinkID,road[i].NameSize,road[i].ClassID,road[i].name);
}


fclose(pF); //关闭文件
free(pchBuf1); //释放空间
pchBuf = NULL;
pchBuf1 = NULL;

return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值