关于INI配置文件分析器的设计(C++)求高手帮忙,不胜感激!!
标准的INI配置文件的格式为:
[节名1]
ValueName1= hello
ValueName2= 1000
[节名2]
ValueName1=you
ValueName2= 100,500
ValueName3=0
ValueName4=6
[节名3]
ValueName1= jack
………………
设计一个文本分析器类CINIReader,可以打开配置文件,给定节名和项目名就可以得到具体值及修改具体值,也可以根据节名 添加和删除节,最后可以把分析器的内容保存为文件。
如上INI文件中,如果设计测试主函数后可如下所示:
CINIReader reader;
string svalue;
reader.Open(“example.ini”);//打开文件
svalue=reader.Get(“节名1”,”ValueName1”);//返回字符串 “hello”
reader.Set(“节名1”,”ValueName2”,”2000”);//修改项目值为”2000”
reader.Add (“节名1”,”ValueName3”,”600”);//在此节中添加一行新值
reader.Save();//可以把修改后结果保存下来
………
[解决办法]
费了劲了,这回智能多了。
#include <windows.h> #include <stdio.h> #include <iostream>#include <fstream>#include <string>using namespace std;class CINIReader{public: bool Open(const string& strFilePath) { m_strFilePath = strFilePath; ofstream file(m_strFilePath.c_str(), ios_base::app); if (file.is_open()) { file.close(); return true; } return false; } string Get(const string& strNode, const string& strKey) { char inBuf[80]; GetPrivateProfileStringA (strNode.c_str(), strKey.c_str(), "Error", inBuf, 80, m_strFilePath.c_str()); return inBuf; } int Set(const string& strNode, const string& strKey, const string& strValue) { return WritePrivateProfileStringA (strNode.c_str(), strKey.c_str(), strValue.c_str(), m_strFilePath.c_str()); } int Add(const string& strNode, const string& strKey, const string& strValue) { return WritePrivateProfileStringA (strNode.c_str(), strKey.c_str(), strValue.c_str(), m_strFilePath.c_str()); } string m_strFilePath;};int main() { string strTitle = "******************************************************\n" " \n" " 请选择如下操作: \n" " \n" " 1 打开.ini文件 \n" " 2 添加配置项 \n" " 3 修改配置项 \n" " 4 查找配置项 \n" " 5 打印文件内容 \n" " 6 退出程序 \n" " \n" "******************************************************\n"; cout << strTitle; bool bIsFirst = true; int iChoice; CINIReader reader; start: while(cout << "请选择:", cin >> iChoice) { if (1 != iChoice && bIsFirst) { cout << "请先打开文件." << endl; continue; } string strFileName; bool bQuit = false; switch(iChoice) { case 1: bIsFirst = false; cout << "请输入文件的全路径:" << endl; cin >> strFileName; if (string::npos == strFileName.find(":\\") || !reader.Open(strFileName)) // 首先打开一个配置文件,如果这个文件不存在就创建它 { cout << "打开文件失败。" << endl; } break; case 2: do { cout << "请输入要添加的配置项[节点名 键名称 键值]: " << endl; string strNodeName; string strKeyName; string strKeyValue; cin >> strNodeName >> strKeyName >> strKeyValue; // 添加一个节点、key、value reader.Add(strNodeName, strKeyName, strKeyValue); do { cout << "是否继续添配置项?y/n " << endl; char ch; cin >> ch; if ('n' == ch) { bQuit = true; break; } else if ('y' == ch) { break; } } while(true); } while (!bQuit); break; case 3: do { cout << "请输入要修改的配置项[节点名 键名称 键值]:" << endl; string strNodeName; string strKeyName; string strKeyValue; cin >> strNodeName >> strKeyName >> strKeyValue; string strKeyValueTMP = reader.Get(strNodeName, strKeyName); if ("Error" == strKeyValueTMP) { cout << "您要修改的键值不存在。" << endl; } else { reader.Set(strNodeName, strKeyName, strKeyValue); cout << "您修改后的键值为: " << strKeyValue << endl; } do { cout << "是否继续修改配置项?y/n " << endl; char ch; cin >> ch; if ('n' == ch) { bQuit = true; break; } else if ('y' == ch) { break; } } while(true); } while (!bQuit); break; case 4: do { cout << "请输入要查找的配置项[节点名 键名称]:" << endl; string strNodeName; string strKeyName; cin >> strNodeName >> strKeyName; string strKeyValue = reader.Get(strNodeName, strKeyName); if ("Error" == strKeyValue) { cout << "您查找的键值不存在。" << endl; } else { cout << "您查找的键值为: " << strKeyValue << endl; } do { cout << "是否继续查找配置项?y/n " << endl; char ch; cin >> ch; if ('n' == ch) { bQuit = true; break; } else if ('y' == ch) { break; } } while(true); } while (!bQuit); break; case 5: { string strLine; ifstream inFile(reader.m_strFilePath); if (inFile.is_open()) { while (getline(inFile, strLine)) cout << strLine << endl; } } break; case 6: return 0; default: //system("cls"); //cout << strTitle; break; } } cin.clear(); fflush(stdin); goto start; return 0;}