Qt应用之txt文件参数式存储应用
目的
1、简单的软件不需要用数据库来管理软件参数
2、参数项目随时后期有变更,要解决灵活新增与删除
3、txt文件需要校验准确性
解决方法
1、 采有文本方式来存储参数
2、参数项目表示方式:[项目名]参数,利用项目名来读写参数
3、通过特殊项目名:[校验码]***作为文件的校验码
示例代码
以下代码是Qt下的写法
假设系统参数如下
struct systemParaStr
{
INT32U port;//端口号参数
INT32U meterID;//仪表ID号
QString loadPath;//默认保存的路径
};
以下代码是将参数与文件内容相互转换的代码,以后若有新增或删除参数,只需“outputPara_systempPara”和“inputPara_systempPara”即可
//"[name]targetContent\n"或[name]targetContent\r\n"
//当QString中有"\n"时,当写入文件,则会自动变为"\r\n",为了满足这一情况。
//此函数自动适用以\r\n收尾和\n收尾的函数
bool DiskFunc::readContentWithName(QString fromContent, QString name, QString &targetContent)
{
int start;
int end;
targetContent = "";
start = fromContent.indexOf(QString("[%1]").arg(name));
if(start == -1)
{
return false;
}
start = start +name.length()+2;
end = fromContent.indexOf("\n",start);
if(end == -1)
{
return false;
}
int endr = fromContent.indexOf("\r",start);
if(endr >=0)
{
if((endr +1) == end )
{
end = endr;
}
}
if(end<start)
{
return false;
}
targetContent = fromContent.mid(start,end-start);
return true;
}
//将参数systemParaStr 转换为文件内容,输出至toContent
void DiskFunc::outputPara_systempPara(QString &toContent, systemParaStr *in)
{
QString str;
int line = 0;//第一行转换后会多一个字节
toContent = "";
str = QString::number(in->port,10);
toContent.append(QString("[PORT]%1\n").arg(str));
line++;
str = QString("%1").arg(in->meterID,10,10,QChar('0'));
toContent.append(QString("[METER_ID]%1\n").arg(str));
line++;
str = in->loadPath;
toContent.append(QString("[LOADPATH]%1\n").arg(str));
line++;
//总长度
int size = toContent.size();
str = QString("%1").arg(size);
line++;
size = size+ str.size()+9+line;
toContent.append(QString("[LENGTH]%1\n").arg(size));
return;
}
//将文件内容fromContent,转换为参数systemParaStr
bool DiskFunc::inputPara_systempPara(QString &fromContent, systemParaStr *outPara)
{
bool ret = true;
QString str;
systemParaStr out;
copySystemPara(outPara,&out);
if(readContentWithName(fromContent,QString("LENGTH"),str))
{
if(fromContent.size() != str.toInt() )
{
ret = false;
}
}
else
{
ret = false;
}
if(readContentWithName(fromContent,QString("PORT"),str))
{
out.port = str.toInt();
}
else
{
ret = false;
}
if(readContentWithName(fromContent,QString("METER_ID"),str))
{
out.meterID = str.toInt();
}
else
{
ret = false;
}
if(readContentWithName(fromContent,QString("LOADPATH"),str))
{
out.loadPath = str;
}
else
{
ret = false;
}
if(ret == true)
{
copySystemPara(&out,outPara);
}
return ret ;
}
调用
//读取文件,并输出至systemParaStr 参数结构体
bool readSystemPara(systemParaStr *in)
{
//找文件
QString fileContent;//文件内容
//读取文件
QString strFilePath = QCoreApplication::applicationDirPath()+"/systemPara.txt";
QFileInfo fileInfo(strFilePath);
if(fileInfo.exists()==false)
{
return false;
}
//读取文件
{
QFile file;
file.setFileName(strFilePath);
if(!file.open(QIODevice::ReadOnly))
{
return false;
}
QByteArray data = file.readAll();
fileContent = data.data();
data.clear();
file.close();
}
systemParaStr outpara;
initSystemPara(&outpara);
if(DiskFunc::inputPara_systempPara(fileContent,&outpara) == false)
{
return false;
}
copySystemPara(&outpara,&GS_systemPara);
return true;
}
//将参数保存至文件
bool writeSystemPara(systemParaStr *in)
{
QString toContent;
DiskFunc::outputPara_systempPara(toContent, in);
//读取文件
QString strFilePath = QCoreApplication::applicationDirPath()+"/systemPara.txt";
QFileInfo fileInfo(strFilePath);
QFile file(strFilePath);
if(!file.open(QIODevice::WriteOnly |QIODevice::Truncate| QIODevice::Text))
{
return false;
}
file.write(toContent.toUtf8());
file.close();
return true;
}
测试结果
以上代码采用文件长度[LENGTH]来核对文件 的正确性。以后可以按以上方法增加项目,如文件属性,校验码、版本等信息,同时也可考虑文件内容加密处理。