c 讀取cfg檔案

2021-09-19 11:37:59 字數 2951 閱讀 3007

參考:

四個檔案 get_cfg.h,get_cfg.cpp,read_cfg.cpp,config.cfg

1.get_cfg.h

/*

這裡 #define comment '#'是巨集定義的方式,易於擴充套件和重構,增加程式的效率;

下面的兩句定義了兩個函式,乙個是讀取配置資訊的函式,

另外乙個是列印所有配置資訊的函式,實參中的 & 是引用,這樣就不是簡單的賦值,而是修改實參同時也在修改傳遞進來的值。

使用comment_char更為清晰易懂一些。

這裡定義了一些主要的函式,是為了在main.cpp使用,而get_cfg.cpp中的其他函式都是實現,而非介面。

*/#ifndef __get_config_h__

#define __get_config_h__

#include #include #include using namespace std;

#define comment_char '#'

bool readconfig(const string & filename, map & m);

void printconfig(const map& m);

void findinconfig(mapm, string key);

#endif //

2.get_cfg.cpp

#include "get_cfg.h"

#include #include using namespace std;

/*desc:

這裡通過map實現了cfg檔案中kv對的訪問,方便操作。

注意這裡的檔案讀取的操作,已經getline等相關函式。

注意整體的邏輯: 開啟檔案、從上到下獲取行、注釋忽略、建立map、訪問kv對,這樣,我們就可以得到cfg檔案中所有有用的引數了。

最後findinconfig函式中,我們將找到的kv輸出,當然,在使用過程中,我們可以直接獲取進行進一步的計算工作。

*/bool isspace(char c)

else }

bool iscommentchar(char c)

else }

// trim函式的作用是把乙個字串左邊和右邊的空格去掉,即為trim

void trim(string & str) // 引用傳參,這樣在函式中修改該引數也會修改相應的變數

int i, start_pos, end_pos;

for (i = 0; i < str.size(); i++) }

if (i == str.size())//如果該行全是空格,則該行最後乙個字元為"\n",此時i == str.size()

start_pos = i; // 獲取到非空格的初始位置

for (i = str.size() - 1; i >= 0; i--) }

end_pos = i;

str = str.substr(start_pos, end_pos - start_pos + 1);

}bool analyseline(const string & line, string & key, string & value) // 分析一行,如果是注釋行,則不處理,如果是k-v行,則提取出key-value值。

int start_pos = 0, end_pos = line.size() - 1, pos;

if ((pos = line.find(comment_char)) != -1)

end_pos = pos - 1; // 可能是注釋在k-v後的情況

} string new_line = line.substr(start_pos, end_pos - start_pos + 1); // 刪掉後半部分的注釋 fix_me: 這裡應該是減錯了吧

// 下面pos的賦值時必要的,這樣,就可在後面得到key和value值了。

if ((pos = new_line.find("=")) == -1) //說明前面沒有 = 號

key = new_line.substr(0, pos); // 獲得key

value = new_line.substr(pos + 1, end_pos + 1 - (pos + 1)); // 獲得value

trim(key);

if (key.empty())

trim(value); // 因為這裡的key和value都是引用傳遞,可以直接被修改,所以不用返回

return true;

}// 讀取乙個cfg檔案並儲存到map中,map中的key和value都是string型別的。

bool readconfig(const string & filename, map& m)

string line, key, value; // 為了後續儲存kv對

while (getline(infile, line)) }

infile.close(); // 當讀取完之後,就要關閉這個檔案。

return true;

}void printconfig(const map& m)

}void findinconfig(mapm, string key) // 注意:之前用的一直都是string型別,所以這裡用的也是string key,而不是char key。

else

}

3. read_cfg.cpp

#include "get_cfg.h"

void read_cfg_test1()

int main()

4.config.cfg

#this is a comment

a = 100

b = 100 #this comment is valid

# this is another

c = 200

NoIFS 使用shell讀取cfg並拆成陣列

需要解析乙個文字,裡面描述了客戶分割槽引數,形式如下 imageconfig.cfg env 1024 2048 env.fex kernel 2049 33791 boot.img recovery 33792 164863 recovery.img玩法就是把每一行拆成單獨的資料,送入對應陣列中,...

C 讀取檔案

using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.text using system.window...

c 讀取檔案

用c 讀取檔案內容中文是亂碼的解決方法 方法1 streamreader din new streamreader c 1.txt system.text.encoding.getencoding gb2312 string html while din.peek 1 din.close 方法2 s...