javaitface 发表于 2013-1-26 12:31:38

读入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]
查看完整版本: 读入2进制文件 电子地图管理系统