1. 程式人生 > >ini檔案中動態陣列的格式和QSetting的讀寫

ini檔案中動態陣列的格式和QSetting的讀寫

有時候我們需要儲存動態陣列到ini檔案中。QSetting提供了很方便的介面給使用者進行ini檔案的讀寫,這一點我們稍後說,首先看看動態陣列在ini檔案中的結構。

首先給個例子簡單說明動態陣列的儲存格式:

struct User {
       string userName;
       string password;
};
User users[3];

如果我們希望在ini檔案中儲存users陣列,檔案內容如下:

[users]

1\userName=***

1\password=***

2\userName=***

2\password=***

3\userName=***

3\password=***

size=3

其中size是自動偵測到的長度。

ini檔案以鍵值對的形式儲存資料,簡單資料的儲存格式很簡單,即key=value。key是鍵,value是值。在上面的例子中user表示一個組,在這個組下有3個user陣列的元素,每個元素的鍵都以其索引(從1開始)開頭,通過分隔符“\”連線子鍵,因為User結構體有userName和password兩個成員變數,所以這裡的子鍵就取這兩個成員變數名。

如果陣列內部還有陣列,比如:

struct User {
       string userName;
       string password;
       int attr[4];
};

則ini檔案的內容如下:

[users]

1\userName=***

1\password=***

1\attr\1\name=***

1\attr\2\name=***

1\attr\3\name=***

1\attr\4\name=***

1\attr\size=4

1\size=1

為簡單起見,這裡的users的陣列長度為1,在這唯一的一個元素中含有一個attr陣列,陣列長度為4。對於這個陣列,我們需要一個名字,即attr,後面通過分割符接上索引號,不像user,陣列中的元素就是一個值,我這裡依然還是給它定義了一個子鍵的名字,即name。

總結一下,對於動態陣列,其鍵的構成如下:

上級鍵\陣列索引\元素名

  • 上級鍵就是這個陣列所在的位置,可以是一個組,就像user一樣,陣列索引之前沒有其他字元,但是最上方存在[User]表示這個陣列是在User組中,且是User組中的唯一成員。像attr這樣,上級鍵其實就是user陣列中的某個元素的鍵,由於user位於頂層,也就是user中的索引號。
  • 陣列索引是對應元素在陣列中的位置,從1開始
  • 元素名是陣列結構體中各成員的名稱

 QSetting讀寫動態陣列

1. 將User陣列寫入ini檔案

    struct User {
<pre name="code" class="cpp">       QString userName;
       QString password;
       int attr[4];
}; User users[1]; QSettings setting(QObject::tr("***.ini"), QSettings::IniFormat); setting.beginReadArray(QObject::tr("User")); users[0].userName = setting.value(QObject::tr("userName")).toString(); users[0].password = setting.value(QObject::tr("password")).toString(); setting.setArrayIndex(0); int n = setting.beginReadArray(QObject::tr("attr")); for (int i = 0; i < 4; ++i) { setting.setArrayIndex(i); users[0].attr[i] = setting.value(QObject::tr("name")).toInt(); } setting.endArray(); setting.endArray();

2. 從ini檔案讀出資料寫入User陣列

    QSettings setting(QObject::tr("***.ini"), QSettings::IniFormat);
    setting.beginWriteArray(QObject::tr("User"));
    setting.setValue(users[0].userName);
    setting.setValue(users[0].password);
    setting.setArrayIndex(0);
    setting.beginWriteArray(QObject::tr("attr"));
    for (int i = 0; i < 4; ++i) {
        setting.setArrayIndex(i);
        setting.setValue(users[0].attr[i]);
    }
    setting.endArray();
    setting.endArray();




相關推薦

ini檔案動態陣列格式QSetting

有時候我們需要儲存動態陣列到ini檔案中。QSetting提供了很方便的介面給使用者進行ini檔案的讀寫,這一點我們稍後說,首先看看動態陣列在ini檔案中的結構。 首先給個例子簡單說明動態陣列的儲存格式: struct User { string userN

mapper檔案動態表名動態屬性的使用

mapper檔案中動態表名和動態屬性的使用   遇到一個需要在一個sql語句中實現動態表名和動態屬性的情境,在多張相似表中查詢不同name的資訊,由於我使用的是Mybatis,所以我需要在mapper檔案中實現動態表名和動態查詢。經過上網查詢,瞭解了${},#{}的原理和使用情境。但是,我在嘗試

python操作txt檔案資料教程[1]-使用pythontxt檔案

python操作txt檔案中資料教程[1]-使用python讀寫txt檔案 覺得有用的話,歡迎一起討論相互學習~Follow Me 原始txt檔案 程式實現後結果 程式實現 filename = './test/test.txt' contents = [] DNA_sequence

json-c 的安裝使用(使用json-c讀取檔案的json資料儲存json格式的資料至檔案

1、json資料格式和json-c簡介[1] JSON(JavaScriptObject Notation) 是一種輕量級的資料交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。 JSON採用完全獨立於語言的文字格式,但是也使用了類似於C語言家族的習慣(包括C,C++

AppDomain 詳解二【轉】-C#動態加載卸載DLL

all created 新版本 odin generic reflect 可能 params 詳細 在C++中加載和卸載DLL是一件很容易的事,LoadLibrary和FreeLibrary讓你能夠輕易的在程序中加載DLL,然後在任何地方 卸載。在C#中我們也能使用Asse

WPF 動態創建刪除控件

null 取消 top font har 刪除 find 不能 led 原文:WPF 中動態創建和刪除控件 動態創建控件 1.容器控件.RegisterName("Name"

使用canvas畫線,在Js動態設定高

1.定義div   <div style="height:240px;" >                            &

16-GPRS(Air202)關於多個檔案的變數呼叫定時器

https://www.cnblogs.com/yangfengwu/p/9968405.html 因為自己看到好多問多個檔案呼叫的,感覺這個應該說一說 對了大家有沒有知道這個是幹什麼的    大家有沒有看這篇 https://www.cnblogs.com/yang

Mysql時間戳格式時間型別格式的裝換

首先我有這樣一個時間 將此時間轉換為時間戳格式: SELECT UNIX_TIMESTAMP(pst.ep_order_time) AS ep_order_time FROM prj_status_time pst WHERE pst.project_id='15414878732

MFC動態陣列CArray的使用

MFC中動態陣列CArray的使用 陣列——這個C語言中的怪物,自從被直接繼承到C++中,便讓無數有識之士們前赴後繼、絞盡腦汁,試圖尋找一種可以動態增長的替代資料型別。當然,最著名的,應該就是vector向量。但是,它的資料定義極其複雜,還有迭代的出現,幾乎徹底摧毀了它

Python function(#) (X)格式 (#)在Python3.*的注意

python 的語法定義和C++、matlab、java 還是很有區別的。 1. 括號與函式呼叫 def devided_3(x): return x/3. print(a) #不帶括號呼叫的結果:<function a at 0x139c756a8>

TensorFlow檢視checkpoint檔案的變數名對應值

在載入模型時, 需要知道checkpoint中變數名稱,一下程式碼可以檢視TensorFlow中checkpoint檔案中的變數名: #!/usr/bin/env python # -*- coding:utf-8 -*- import os from tensorflow.pytho

在for迴圈動態拼接字串新增事件

不多說,直接開始 ES6之前常用寫法: for(var i = 0;i<10;i++){   /閉包寫法   (function(j){ var a = document.createElement("div");   

C#位元組陣列(byte[])字串相互轉換

轉換過程主要使用到System.Text.Encoding名稱空間下的類 1. 字串轉換成位元組陣列byte[]: string str = "This is test string"; byte[] byteArray = System.Text.Encoding.De

html檔案flash視訊格式(flv、swf)檔案的嵌入方法

flash檔案的格式:.FLV 和 .SWF  flash視訊格式有兩種副檔名可以使用:.flv和.swf。他們有什麼不同呢?  (1)一個.flv檔案(flash視訊)是基於圖片的視訊流和音訊。如果你在執行一個流服務,flv將是一個好的選擇。上游條件是,這個檔案的任何部分可以被客戶終端訪問,並且任何時間不

【整理】eclipse.ini/myeclipse.ini檔案引數配置【zz】

     今天下午查了一些關於優化MyEclipse速度的文章,受益匪淺。不過知其然也要知其所以然。比如說在提到通過修改myeclipse.ini檔案中引數-Xms,-Xmx,-PerSize的值時,這幾個引數具體是指什麼?在網上搜集了一些資料,現整理如下: 這涉及到JVM的

c語言結構體動態陣列的使用

【背景】 c語言結構體中動態陣列使得使用者能夠根據需要來申請空間,相比靜態陣列,更能有效利用儲存空間。 【正文】 1. 動態陣列在結構體中間 #include <stdio.h> #include <stdlib.h> #include <

1 Java程式檔案函式起始行終止行在程式檔案位置的判定__抽象語法樹方法

應用需求: 實現對BigCloneBench中函式體的克隆檢測,必須標註出起始行號和終止行號。 問題: 給定一個Java檔案,從中提取出每個函式的起始行和終止行。 難點: 這個問題的難點在於,對於Java的解析器而言,其在形成抽象語法樹的過程中,已經對原始碼檔案進行了劃分,然後,形成了對函式的抽象語

.bat 檔案的相對路徑絕對路徑問題

工作中遇到路徑問題的總結: 一般來說,批處理檔案處理相對路徑的時候,起始位置是bat檔案所在的目錄,比如在D:\XX目錄下執行bat檔案,所有相對目錄的操作都會以D:\XX下執行。 例如: 開

java如何設定.csv檔案時間的格式

csv是逗號分割值得縮寫,不可以定義單元格格式,所以匯出來的檔案,如下圖,時間格式不完整,想了半天, 給時間前面拼接一個製表符程式碼如下圖 匯出來的時間就是yyyy-mm-dd hh:mm:ss的完整格式,