龔燕峰

摘 要 利用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