阅读:1592回复:4
救命啊,请各位老虾们给看看一个小程序啊
<P>小弟不才,初学GIS,写了一个读取.shp文件的程序,结果出了问题,卡了3,4个星期不能解决,只好上论坛来请各位老鸟们给以指点迷津啊!先谢谢各位!!!</P>
<P>因为原来的程序有点长,所以将错误之处提炼成这个小程序,方便大家理解。问题就出在读取文件头和记录头部分。display_shp()函数和2个cout语句是我用来检验读取结果是否正确的函数,结果发现程序最后读取的几行老是有问题。好像读到记录头的下面去了,读到了记录内容的文件类型部分。而记录头部分读取结果则是错误的。似乎中间漏读了什么。。。而读取文件头部分则是前面都正确,而最后一行,读取dbMMax时似乎出错了。。。可是我怎么也想不明白这段程序有什么错误!!!拜托各位大虾帮帮忙啊,这个项目卡我这里卡了1个多月了,老板都怒了。</P> <P>#include <iostream><BR>#include <fstream><BR>#include <cstring><BR>#include <string><BR>#include <cstdio><BR>#include <cstdlib><BR>#include <cmath></P> <P>using namespace std;</P> <P>typedef unsigned char uchar;</P> <P>#define NULLSHP 0<BR>#define POINT 1<BR>#define POLYLINE 3<BR>#define POLYGON 5</P> <P>struct SHPHEADER<BR>{<BR> int iFileCode; //文件标识<BR> int iReserved[5]; //保留字节<BR> int iFileLength; //文件长度<BR> int iVersion; //版本号<BR> int iShpType; //文件类型<BR> double dbXMin;<BR> double dbYMin;<BR> double dbXMax;<BR> double dbYMax;<BR> double dbZMin;<BR> double dbZMax;<BR> double dbMMin;<BR> double dbMMax;<BR>}shphead;//坐标文件(.shp)的文件头结构</P> <P>struct SHPRECORDHEADER <BR>{//----------------坐标文件(.shp)的实体信息的记录头<BR> int iRecordNum; //记录数<BR> int iContentLength; //记录内容长度<BR>}shprecordh;</P> <P>void display_shp(SHPHEADER shp_h);<BR>static void SwapWord( int length, void * wordP );//位序转换程序</P> <P>int main()<BR>{<BR> ifstream inshpfile("wuhan.shp",ios::in | ios::binary);<BR> inshpfile.read((char *);shphead,sizeof(SHPHEADER));<BR> inshpfile.read((char *);shprecordh,sizeof(SHPRECORDHEADER));<BR> SwapWord(sizeof(int),;shphead.iFileCode);<BR> SwapWord(sizeof(int),;shphead.iFileLength);<BR> SwapWord(sizeof(int),;shprecordh.iContentLength);<BR> SwapWord(sizeof(int),;shprecordh.iRecordNum);<BR> display_shp(shphead);<BR> cout<<shprecordh.iRecordNum<<endl;<BR> cout<<shprecordh.iContentLength<<endl;<BR> return (0);<BR>}</P> <P>void display_shp(SHPHEADER shp_h)<BR>{<BR> cout<<"坐标文件的文件头标志代码: "<<shp_h.iFileCode<<endl;<BR> cout<<"坐标文件文件头保留位: ";<BR> for(int i=0;i<5;i++)<BR> {<BR> cout<<shp_h.iReserved<<",";<BR> } <BR> cout<<endl<<"文件长度: "<<shp_h.iFileLength<<endl;<BR> cout<<"文件版本号: "<<shp_h.iVersion<<endl;<BR> cout<<"坐标文件几何类型标志代码: "<<shp_h.iShpType<<endl;<BR> cout<<shp_h.dbXMin<<endl;<BR> cout<<shp_h.dbXMax<<endl;<BR> cout<<shp_h.dbYMin<<endl;<BR> cout<<shp_h.dbYMax<<endl;<BR> cout<<shp_h.dbZMin<<endl;<BR> cout<<shp_h.dbZMax<<endl;<BR> cout<<shp_h.dbMMin<<endl;<BR> cout<<shp_h.dbMMax<<endl;<BR> //cout<<shp_h.temp<<endl;<BR>}</P> <P><BR>static void SwapWord( int length, void * wordP )<BR>{ //位序转换程序<BR> int i;<BR> uchar temp;</P> <P> for( i=0; i < length/2; i++ )<BR> {<BR> temp = ((uchar *) wordP);<BR> ((uchar *)wordP) = ((uchar *) wordP)[length-i-1];<BR> ((uchar *) wordP)[length-i-1] = temp;<BR> }<BR>}</P> |
|
1楼#
发布于:2006-04-16 17:44
55555555,好惨啊!!!大家来帮帮我把!!先谢谢了!!!!
|
|
2楼#
发布于:2006-04-18 17:04
<P>怎么没人帮一下啊。。。。。郁闷了。。。。</P>
|
|
3楼#
发布于:2006-04-24 09:26
<P>小的也不才,不过依我看,你的问题在红色字体部分:</P>
<P>int main()<BR>{<BR>ifstream inshpfile("wuhan.shp",ios::in | ios::binary);<BR>inshpfile.read((char *);shphead,<FONT color=#ff0000>sizeof(SHPHEADER)</FONT>);<BR>inshpfile.read((char *);shprecordh,<FONT color=#ff0000>sizeof(SHPRECORDHEADER)</FONT>);<BR>SwapWord(sizeof(int),;shphead.iFileCode);<BR>SwapWord(sizeof(int),;shphead.iFileLength);<BR>SwapWord(sizeof(int),;shprecordh.iContentLength);<BR>SwapWord(sizeof(int),;shprecordh.iRecordNum);<BR>display_shp(shphead);<BR>cout<<shprecordh.iRecordNum<<endl;<BR>cout<<shprecordh.iContentLength<<endl;<BR>return (0);<BR>}</P> <P>应为sizeof()-1,因为这个sizeof()长度是包含文件头下的。不知你的问题解决了没有</P> |
|
4楼#
发布于:2006-04-29 14:59
<P>会不会是SwapWord用的不对啊?<BR>我看到别人的有</P>
<P>i = 1;<BR> if( *((uchar *) ;i) == 1 )<BR> m_bBigEndian = FALSE;<BR> else<BR> m_bBigEndian = TRUE;</P> <P>if(!m_bBigEndian) 才使用SwapWord</P> <P>我也不懂,不知道对不对啊</P> |
|