程式開發基礎學習五(json配置、解析檔案,c++篇)

來源:互聯網
上載者:User

        在遊戲中載入解析設定檔家常便飯。以前用過xml,對多維陣列結構良好的應用加上xml設定檔遵循html規則,xml還是特別方便的,可是當資料量比較大的話,一堆助記符不僅寫起來比較煩,出現問題查起來很費眼睛。今天用一種新的檔案解析方式,文法挺簡單的,但真正將這個小型庫配置到自己的工程裡還是費了不少力氣。 

        由於這幾天一直在看boost庫,boost庫的話通過設定包含目錄,在自己的檔案裡引用hpp檔案就能很輕鬆的使用裡面的函數,方法。在思維慣性的作用下,繼續包含josn標頭檔,結果悲劇的一天開始了,開始報錯說“無法解析的外部符號 "public: __thiscall Json::Value::~Value(void)" (??1Value@Json@@QAE@XZ),該符號在函數 _wmain 中被引用”,很明顯就是說對函數進行了申明,但沒有定義,很常見的問題。那就將cpp檔案包含到工程裡,由於h檔案是放在include目錄下的,在配置裡被包含了。可cpp我並沒有放在include檔案下,提示錯誤沒有包含stdax.h檔案,異常鬱悶。。。。。。大家知道在vs建立的新工程都要包含stdax.h檔案,所以手動將庫檔案stdax.h是手動加到庫檔案裡,編譯通過了。但感覺不妥啊,庫檔案不應給改啊!!!到這裡想到了包含lib檔案的方式。

        大概看了下文檔,lib檔案就是所謂的靜態連結檔案,名字看著挺嚇人。其實就是將函數導成一種新的檔案,包含到工程中,編譯的時候調用,還有一種dll檔案就是所謂的動態連結檔案。程式啟動並執行時候連結的檔案。好吧,終於明白了什麼是lib檔案,如何產生lib檔案又是個問題,找了半天文檔,發現在vs的配置屬性裡可以改變輸出檔案類型,分別有exe,lib,dll類型的檔案。產生lib檔案後再包含到工程裡,但是編譯提示找不到相應的lib檔案,什麼情況 -_-!,想想肯定是路徑問題了,將lib檔案放到了工作目錄,但在vs配置裡添加的lib檔案,編譯器會去根目錄找這個檔案。我是真心無語啊,這ide確實大大提高了工作效率,但不可否認的是,如果對ide不熟悉的話,遇到問題能害死人。還有推薦盡量用#pragma comment(lib, "test.lib")包含庫檔案吧。這樣自己test.lib放到哪都沒問題,自己可以任意放到自己喜歡的目錄(最好還是放到工作目錄。。。。。)。庫檔案加上了,結果又跑出個json源檔案產生的庫檔案和系統預設的庫檔案衝突,msvcrt.lib,選擇將系統庫msvcrt.lib忽略,編譯通過。但這種方式很是不爽,想想用包含檔案的方法,之前json標頭檔在配置屬性裡已經包含在x:/include裡了,在工程裡添加檔案夾include然後將json實現檔案cpp都添加進來,編譯通過。哦,終於明白了,這個檔案夾不能亂起,要和設定檔裡的名字一樣,這樣編譯器在編譯的時候直接能找到對應的實現檔案。好吧,問題終於解決了,總結一下用個庫得知道多少知識。

        1、什麼是庫

        2、如何將庫添加到工程

        3、什麼是工程工作目錄,什麼工程根目錄

        4、編譯器編譯時間尋找檔案的方式

        5、庫檔案衝突和解決辦法

        6、什麼是虛擬映射

        好吧,這些障礙掃清後再來看json檔案配置和解析方法,這個可以參考官方文檔,我這裡大致說說我的理解。json裡有兩種符號:一種是"{}",另一種是“[]”。大括弧一個對象,中括弧表示一個數組。比如說 在設定檔寫下{"name" : "xiaoy", "age" : 17},然後看代碼,如何載入、列印這個對象。

#include "stdafx.h"#include <iostream>#include <fstream>#include "json\json.h"using namespace std;int _tmain(int argc, char* argv[]){fstream file("test.json");if (!file){cout<<"Open file test.json fail!!!"<<endl;}Json::Value root;Json::Reader reader;if (!reader.parse(file, root, false)){cout<<"Parse error"<<endl;}string name = root["name"].asString();int age = root["age"].asInt();cout<<"name:"<<name<<"\tage:"<<age<<endl;getchar();return 0;}

       看見了嗎,root就如c++裡map,這樣是不是很方便。設定檔也很簡單。

     再看一下,數組的用法。json設定檔為[{"name" : "xiaoy", "age" :17} , {"name" : "xiaot", "age" : 20}],代碼如下:

#include "stdafx.h"#include <iostream>#include <fstream>#include "json\json.h"using namespace std;int _tmain(int argc, char* argv[]){fstream file("test.json");if (!file){cout<<"Open file test.json fail!!!"<<endl;}Json::Value root;Json::Reader reader;if (!reader.parse(file, root, false)){cout<<"Parse error"<<endl;}int size = root.size();for (int i = 0; i < size; ++i){string name = root[i]["name"].asString();int age = root[i]["age"].asInt();cout<<"age:"<<age<<"\tname:"<<name<<endl;}getchar();return 0;}

        看到了吧,這次區別是root變成一個數組了,遍曆數組就可以了,注意資料和對象之間都要用","隔開。當然了實際中肯定有更加複雜的資料結構,到時活學活用吧。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.