读入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;
}

你可能感兴趣的:(c)