首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于INI配置文件分析器的设计(C++)求好手帮忙,不胜感激!

2012-07-30 
关于INI配置文件分析器的设计(C++)求高手帮忙,不胜感激!!标准的INI配置文件的格式为:[节名1]ValueName1 h

关于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();//可以把修改后结果保存下来
………

[解决办法]
费了劲了,这回智能多了。

C/C++ code
#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;} 

热点排行