APP下载

航标位置自动校核系统中航标数据解析算法的运用

2016-10-21龚燕峰

电子技术与软件工程 2016年5期
关键词:堆栈数据库

龚燕峰

摘 要 利用C++编程技术采用堆栈数据结构将从远程数据库获取到的原始航标数据进行解析处理,使得符合整个航标位置准确性自动校核系统的数据格式要求,并进一步将解析出来的航标数据存入指定的数据库,以备后期对航标位置复核时使用。航标数据的解析工作是整个航标位置自动校核系统运行的开端,也是系统得以运行的基础。

【关键词】C++ 堆栈 数据解析 数据库

本文在长江重庆航道局航标位置自动校核系统项目的基础上进行论述的,其中原始航标数据的解析是整个航标位置自动校核系统项目的开端和进行项目其它阶段的基础,同时也是整个系统项目的核心环节,如何高效率的将从航标遥测遥控系统获得的原始航标数据解析成系统项目中能直接使用的数据非常重要。

本项目软件系统通过SoapClient远程访问航标遥测遥控系统,并通过航标遥测遥控管理软件系统间接地从后台数据库获取航标的数据。

1 原始航标数据的解析

上述获取到的有关航标的数据暂时保存在一个文档中,初步获取的保存在这个文档中的数据还不能直接在项目的软件中使用,因此必须对这些数据做进一步解析处理,在航标数据的解析工作中我们采用了顺序栈。

顺序栈的类定义中各成员变量和成员函数的含义:

m_pBuffer:为指向栈元素的数组的头指针;

m_pTop和m_pBottom:分别指向栈顶和栈底;

IsFull()成员函数:用来判断栈中元素是否已经满了;

GetSize()成员函数:用来获取栈中元素的个数,随着新元素的进栈和栈顶元素的出栈,在需要的时候需重新调用GetSize()成员函数;

push(T element)成员函数:用来将新元素写入栈;

pop(T& element)成员函数:用来从栈中取出元素。

图1是整个航标数据解析算法的流程图,pChar为指向存有初始航标数据的拷贝字符数组的指针。

1.1 读出原数据并获得其副本

利用文件操作函数fopen打开之前保存了航标数据的文本文档,将航标数据读出到自定义的字符数组中,其中,全局函数GetModuleFileName(),用于获取工程当前目录;在使用那个保存有航标数据的字符数组前,先利用memcpy()函数获得原数据的一个拷贝,以保证原数据的最终不被修改的原则,进行数据拷贝前还需先将自定义的拷贝数组的内存进行清零操作,在此,用到了memset()函数,为了保证拷贝数据的完整性,使用了多线程中的线程同步機制,具体采用了事件对象的线程同步方法,使得原数据在拷贝的过程中不被打断。

1.2 解析数据

准备工作做好后,开始进入数据的核心解析工作了,本文主要利用一个大的while循环和堆栈来进行,循环条件是判断一个指向待解析数据的字符指针是否为空,只要不为空,则循环继续。在整个while循环里再利用一个if...else...选择结构具体判断指针所指向的字符为哪种类型,在else语句块中,若所指向的字符不为“,”或“}”,则将字符数据存入栈中,直至遇到“,”或“}”字符,这意味着某个数据项或数据元素的结束,此时, if语句的执行主体要完成数据项和数据元素的读取和储存工作,每执行完这样一个if语句主体便意味着一个航标的特性数据项或一整个航标的数据元素解析工作完成了。由于每个航标数据元素包括很多子元素,如:航标的经度、纬度等,因此,在if语句主体中,通过其他的结构具体完成子元素的解析工作,主要采用了几个while和for循环结构,同时,由于子元素又包含两个数据项,将它们分别命名为数据项名和数据项值,只有分别完成了数据项名和数据项值的解析才算完成了一个子元素的解析工作。

数据项值的解析:

经过最初的while大循环,代表数据项值的原始数据已被保存在栈中,为了解析它,需通过另一个while循环逐个将其从栈中取出进行判断,只要栈非空,取出的字符非“"”并且非“:”,则将此字符存入一个字符数组中,循环结束后便完成了一个数据项值的解析。

数据项名的解析:

与数据项值相同,经过最初的while大循环,代表数据项名的原始数据已被保存在栈中,此时,通过另外一个while循环继续从栈中取出数据进行判断,只要栈非空并且取出的字符非“"”,则将此字符存入一个字符数组中,循环结束后便完成了一个数据项名的解析。

对数据项的解析工作完成后,即可将一个子元素保存在一个BEACON类型的结构中,此过程中采用了另一个if...else...结构,以strcmp()函数的返回值作为判断条件,将与指定的数据项名匹配的数据项值依次保存在BEACON结构对应的成员中。完成某个数据项值的保存后继续利用其它if语句判断指向原数据的字符指针的内容是否为“}”(因为“}”意味着原数据中一个航标数据元素的结束),若为“}”,则将此时的BEACON结构保存的数据写入到数据库中,至此,航标数据的一个解析循环工作结束。

2 总结

本文详述了在航标位置自动校核系统中对航标数据的解析算法的运用。首先利用Soap Client 客户端通过航标遥测遥控软件管理系统远程获取航道局航标数据库的航标数据,并使用堆栈数据结构和C++编程技术将获取到的原始航标数据进行解析,使其成为符合本系统规范的数据格式要求,并最后实现了将其存储到本地数据库以备用。为整个航标位置自动校核系统的成功运行提供了必要的数据基础。

参考文献

[1]David J.Kruglinski著,潘爱民,王国印译.Visual C++ 技术内幕[M].北京:清华大学出版社,2002.

[2]长江航道局,长江干线航标配布研究[Z]. 武汉:长江航道局,2004.

作者单位

重庆交通大学交通运输学院 重庆市 400074

猜你喜欢

堆栈数据库
基于行为监测的嵌入式操作系统堆栈溢出测试*
嵌入式软件堆栈溢出的动态检测方案设计*
基于堆栈自编码降维的武器装备体系效能预测
一种用于分析MCS-51目标码堆栈深度的方法
Cx51程序设计的堆栈空间计算方法
基于堆栈的24点游戏解决方案