參考:
四個檔案 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...