📄 shapedesc.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include "ShapeDesc.h"
//输入文件
char* GetFileNameByInput(char buffer[])
{
printf("Please input a shape file's name with directory\n");
while (gets(buffer)==NULL)
{
printf("Sorry, you input nothing,Please try again\n");
}
return buffer;
}
//转换字节顺序
int Big2LittleEndian(int num)
{
int reverse;
char bit0, bit1, bit2, bit3;
bit0 = (num & 0x000000ff);
bit1 = (num & 0x0000ff00) >> 8;
bit2 = (num & 0x00ff0000) >> 16;
bit3 = (num & 0xff000000) >> 24;
reverse = (bit0 << 24) | (bit1 << 16) | (bit2 << 8) | (bit3);
return reverse;
}
int main(int argc, char* argv[])
{
char* sFileName;
FILE *fp;
char sBuffer[256];
if (argc < 2)
{
sFileName = GetFileNameByInput(sBuffer);
}
else
sFileName = argv[1];
if((fp=fopen(sFileName,"rb"))==NULL)
{
perror("Can't open file, please check errors\n");
return 0;
}
unsigned int FileCode;
unsigned int FileLength;
int ShapeType;
int temp;
enum SHAPETYPE enumShpType;
//读文件头
fread(&FileCode,sizeof(unsigned int),1,fp);
int nCode = Big2LittleEndian(FileCode);
if(9994 != nCode)
{
perror("This file is illegal shape file\n");
fclose(fp);
return 0;
}
fread(&temp,sizeof(int),5,fp);//跳过5个integer
fread(&FileLength,sizeof(unsigned int),1,fp);
unsigned int nFLen = (unsigned int)Big2LittleEndian(FileLength);
printf("This file has %u bytes",nFLen);
fread(&temp,sizeof(int),1,fp);//跳过1个integer
fread(&ShapeType,sizeof(int),1,fp);
switch(ShapeType)
{
case 0 :
enumShpType = NullShape;
break;
case 1 :
enumShpType = Point;
break;
case 3 :
enumShpType = Polyline;
break;
case 5 :
enumShpType = Polygon;
break;
default:break;
}
printf("This Shape File's Type is %d\n",ShapeType);
fseek(fp,100,SEEK_SET);//跳到文件头结束处
//读记录
RECORDHEADER rh;
int i;
while(!feof(fp))
{
fread(&rh,sizeof(RECORDHEADER),1,fp);//记录头
printf("record number:%d, record length:%d\n",Big2LittleEndian(rh.RecordNumber) ,Big2LittleEndian(rh.RecordLength) );
if(enumShpType==Point)
{
POINT pt;
fread(&temp,sizeof(int),1,fp);
fread(&pt,sizeof(POINT),1,fp);
printf("x:%f y:%f\n",pt.x ,pt.y );
}
else if(enumShpType==Polyline)
{
POLYLINE pl;
fread(&temp,sizeof(int),1,fp);
fread(&pl.Box ,sizeof(double),4,fp);
fread(&pl.NumParts ,sizeof(int),1,fp);
fread(&pl.NumPoints ,sizeof(int),1,fp);
pl.Parts =(int*) malloc(sizeof(int)*pl.NumParts );
pl.Points =(POINT*)malloc(sizeof(POINT)*pl.NumPoints );
fread(pl.Parts,sizeof(int),pl.NumParts ,fp);
for(i=0;i<pl.NumParts ;i++)
printf("the index of %dth part is %d\n",i,*(pl.Parts + i));
fread(pl.Points ,sizeof(POINT),pl.NumPoints ,fp);
for(i=0;i<pl.NumPoints ;i++)
printf("%dth point at x:%f y:%f\n",i,(pl.Points+i)->x ,(pl.Points+i)->y );
free(pl.Parts );
free(pl.Points );
}
else if(enumShpType==Polygon)
{
POLYGON pg;
fread(&pg.Box ,sizeof(double),4,fp);
fread(&pg.NumParts ,sizeof(int),1,fp);
fread(&pg.NumPoints ,sizeof(int),1,fp);
pg.Parts =(int*) malloc(sizeof(int)*pg.NumParts );
pg.Points =(POINT*)malloc(sizeof(POINT)*pg.NumPoints );
fread(pg.Parts,sizeof(int),pg.NumParts ,fp);
for(i=0;i<pg.NumParts ;i++)
printf("the index of %dth part is %d\n",i,*(pg.Parts + i));
fread(pg.Points ,sizeof(POINT),pg.NumPoints ,fp);
for(i=0;i<pg.NumPoints ;i++)
printf("%dth point at x:%f y:%f\n",i,(pg.Points+i)->x ,(pg.Points+i)->y );
free(pg.Parts );
free(pg.Points );
}
}
fclose(fp);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -