在项目开发过程中,有一个需求,程序启动时会定义一组全局变量,当用户操作这些变量,做一些修改,需要记住用户的操作,下次打开软件,按照用户上次设置的值进行计算显示。
配置文件格式如下,非常简单
在此解决思路是,先读取配置文件,循环每读一行,解析变量和它对应的值,全部存起来,然后用当前需要记录的值,去集合中找,如果找到了,就更新值,如果没找到就增加到集合中,最后全部再写入文件。
#include <QtCore/QCoreApplication> #include <QFile> #include <QTextStream> #include <QDebug> void DumpCfg(const std::string& strName,const std::string& strValue) { QFile rfile("C:\\Users\\Administrator\\Desktop\\123.cfg"); if (!rfile.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Can‘t open the file!" << endl; } std::map<std::string, std::string> mvars; while (!rfile.atEnd()) { QByteArray line = rfile.readLine();//读一行 QString strLine(line); if (strLine[0] == ‘;‘ || strLine.indexOf("--") !=-1) { continue; } int pos = strLine.indexOf("="); QString strVar = strLine.left(pos); QString strValue = strLine.right(strLine.length() - pos - 1); strValue = strValue.simplified();//返回一个字符串,该字符串已从开始和结束处删除空白,并将内部包括ASCII字符’\t’,’\n’,’\v’,’\f’,’\r’和’ ‘.替换为‘ ’,如果替换后有两个空格的话,只保留一个空格。 std::string sVar = strVar.toLocal8Bit(); std::string sValue = strValue.toLocal8Bit(); mvars[sVar] = sValue; } rfile.close(); std::map<std::string, std::string>::iterator iter = mvars.find(strName); if (iter != mvars.end()) { iter->second = strValue; } else { mvars[strName] = strValue; } //写文件 QFile wfile("C:\\Users\\Administrator\\Desktop\\123.cfg"); if (!wfile.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() << "Can‘t open the file!" << endl; } QTextStream out(&wfile); for (std::map<std::string, std::string>::iterator iter = mvars.begin(); iter != mvars.end();++iter) { out << QString("%1=%2").arg(iter->first.c_str()).arg(iter->second.c_str()) << "\n"; } wfile.close(); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); DumpCfg("abc", "10");//记录修改过得变量 return a.exec(); }