⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shapedesc.cpp

📁 利用vc开发gis系统有用的可以下一下哈欢迎大家使用
💻 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 + -