求指点:
#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;
}
#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;
}