cwcjcwcj
路人甲
路人甲
  • 注册日期2006-01-17
  • 发帖数7
  • QQ
  • 铜币132枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1407回复:4

救命啊,请各位老虾们给看看一个小程序啊

楼主#
更多 发布于:2006-04-16 17:40
<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>
喜欢0 评分0
cwcjcwcj
路人甲
路人甲
  • 注册日期2006-01-17
  • 发帖数7
  • QQ
  • 铜币132枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2006-04-16 17:44
55555555,好惨啊!!!大家来帮帮我把!!先谢谢了!!!!
举报 回复(0) 喜欢(0)     评分
cwcjcwcj
路人甲
路人甲
  • 注册日期2006-01-17
  • 发帖数7
  • QQ
  • 铜币132枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2006-04-18 17:04
<P>怎么没人帮一下啊。。。。。郁闷了。。。。</P>
举报 回复(0) 喜欢(0)     评分
x13a13
路人甲
路人甲
  • 注册日期2006-04-06
  • 发帖数61
  • QQ
  • 铜币252枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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>
举报 回复(0) 喜欢(0)     评分
figo
路人甲
路人甲
  • 注册日期2006-03-24
  • 发帖数53
  • QQ83877352
  • 铜币275枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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>
举报 回复(0) 喜欢(0)     评分
游客

返回顶部