Qt应用之txt文件参数式存储应用

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]来核对文件 的正确性。以后可以按以上方法增加项目,如文件属性,校验码、版本等信息,同时也可考虑文件内容加密处理。

你可能感兴趣的:(qt,开发语言)