读入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;
road()
{
struct_size=0;
LinkID=0;
NameSize=0;
ClassID=0;
Xlu=0;
flag=0;
}
}road;
int main()
{
char *pchBuf = NULL;
char *pchBuf1 = NULL;
intnLen = 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 = '\0'; //添加字符串结尾标志
pchBuf1=pchBuf;
for (roadnum=0;sum<nLen;roadnum++)
{
int a={0},num=0;
for (i=0;i<2;i++)
{
road.struct_size+=pchBuf;
}
pchBuf+=2;
road.LinkID+=pchBuf*16*16+pchBuf;
pchBuf+=4;
for (i=0;i<2;i++)
{
road.NameSize+=pchBuf;
}
pchBuf+=2;
/*
i=0;
pchBuf=pchBuf+pchBuf*16*16;
do
{
a=pchBuf%2;
pchBuf=pchBuf/2;
num++;
} while (((unsigned int)pchBuf)>=2);
for (i=0;i<4;i++)
{
road.ClassID+=a;
}
for (i=4;i<7;i++)
{
road.Xlu+=a;
}
road.flag=a;
*/
pchBuf+=4;
memcpy(road.name,pchBuf,road.struct_size-12);
road.name.struct_size-12]='\0';
pchBuf+=road.struct_size-12;
sum+=road.struct_size;
}
for (i=0;i<roadnum;i++)
{
printf("%d%d%d%d%s\n",road.struct_size,road.LinkID,road.NameSize,road.ClassID,road.name);
}
fclose(pF);//关闭文件
free(pchBuf1); //释放空间
pchBuf = NULL;
pchBuf1 = NULL;
return 0;
}
页:
[1]