Qt之以文本形式存储与读取参数方法

目的

有时程序不采用数据库来管理参数,内可以考虑用文本的方式来管理

实现方法

文件格式:txt
编码:写与读双方一致即可
参数约定:[name]content\n
name:指参数名称,具有唯一性
content:参数内容
格式:由读与写方式约定,比如常用字符串与整型。
\n:换行
文件内容举例:
[version] backupFactoryData V01
[meterId]123456

代码简写

void backupFactoryData(void)
{
    int meterId; //仪表ID
    GSPara_lock.lock();
    meterId = GSPara.versionData.meterId;
    GSPara_lock.unlock();
    //以文件形式打开文件
    QString strFilePath = QString("%1/backupFactoryData.txt").arg(qApp->applicationDirPath());
    QFile file(strFilePath);
    if(!file.open(QIODevice::WriteOnly |QIODevice::Truncate| QIODevice::Text))
    {
         return;
    }
    QString temp = "";
    QString str;
    //第一行参数:版本
    temp.append("[version]backupFactoryData V01\n");
    //第二行:仪表ID
    str = QString::number(meterId,10);
    temp.append(QString("[meterId]%1\n").arg(str));

    file.write(temp.toUtf8());
    file.close();
    //进行磁盘同步,防突然断电,导致文件丢件
    ToolFunc::System_sync();
}

void readAndDelFactoryData()
{
    bool meterId_flag = false;
    int meterId; //仪表ID

    //查询文件是否存在
    QString strFilePath = QString("%1/backupFactoryData.txt").arg(qApp->applicationDirPath());
    QFileInfo fileInfo(strFilePath);
    if(fileInfo.exists()==false)
    {
        return;
    }
    QFile file;
    file.setFileName(strFilePath);
    if(file.open(QIODevice::ReadOnly))
    {
        QByteArray data = file.readLine();
        QString s = data.data();
        s = s.trimmed();
        if(s != "[version]backupFactoryData V01")
        {
           //版本错误
        }
        else
        {
            QString name;
            QString content;
            int start;
            int end;
            while(!file.atEnd())
            {//逐行读取参数
                QByteArray data = file.readLine();
                QString s = data.data();
                s = s.trimmed();
                //取关键字"[]"
                start =  s.indexOf("[");
                end   =  s.indexOf("]");
                if((start != 0)||(end < 1))
                {
                    continue;
                }
                name = s.mid(start+1,(end-start)-1);
                content = s.mid(end+1);
                if(name == "meterId")
                {
                  meterId_flag = true;
                  meterId = content.toInt();//转化为具体的数据格式
                  //qDebug()<<"meterId = "<<meterId;
                }
            }
        }
        file.close();
    }
    //参数处理
。。。。
}
    

以上代码只是简单应用示例,大家也可写成输入“name”,调取文本内容,然 后再进行格式转化。具体看程序应用方式。

  • 0
    点赞
  • 2
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

涛···

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值