Qt使用txt文件保存参数

项目中程序需要保存用户配置参数,写了一个使用txt文件保存参数的测试代码,记录以便后续移植使用:

参数:

struct objParam
{
    QString obj1Name;
    int obj1Steps;
    QString obj2Name;
    int obj2Steps;
    QString obj3Name;
    int obj3Steps;
    QString obj4Name;
    int obj4Steps;
    QString obj5Name;
    int obj5Steps;
    QString obj6Name;
    int obj6Steps;
};

保存格式:

数据存储形式 "[paramName]paramValue\n"或[paramName]paramValue\r\n"
1、头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QFile>
#include <QFileInfo>
#include <QDir>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

struct objParam
{
    QString obj1Name;
    int obj1Steps;
    QString obj2Name;
    int obj2Steps;
    QString obj3Name;
    int obj3Steps;
    QString obj4Name;
    int obj4Steps;
    QString obj5Name;
    int obj5Steps;
    QString obj6Name;
    int obj6Steps;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pb_paramWrite_clicked();

    void on_pb_paramRead_clicked();

private:
    Ui::MainWindow *ui;

    objParam m_strObjParam;

    /*
     * 在一段字符串中通过参数名读取参数值
     * 数据存储形式 "[paramName]paramValue\n"或[paramName]paramValue\r\n"
     * fileContent-用于查找的总的字符串,来自于从txt文件读取的全部内容
     * paramName-索引的数据名称(须唯一)
     * paramValue-存根据名称放读取到的参数值
     * 成功返回true 失败返回false
     */
    bool getParamValueFromFileContentWithName(QString fileContent, QString paramName, QString &paramValue);

    /*
     * 将objParam转换为一段字符串fileContent,用于后续将其写入txt文件
     * fileContent-输出objParam转换的用于存储的字符串
     * inputParam-要转换为存储字符串的参数结构体
     */
    void param2FileContent(QString &fileContent, objParam *inputParam);

    /*
     * 将一段字符串转换为objParam
     * fileContent-用于转换的一段字符串,来自于从txt文件读取的全部内容
     * outputParam-输出转换后的参数结构体
     */
    bool fileContent2Param(QString &fileContent, objParam *outputParam);

    /*
     * 读出文件内容输出至objParam
     * param-读取txt文件输出至objParam
     */
    bool readParamFromFile(objParam *param);

    /*
     * 将objParam参数保存至文件
     * param-读取txt文件输出至objParam
     */
    bool writeParamToFile(objParam *param);
};
#endif // MAINWINDOW_H
2、在一段字符串中通过参数名读取参数值
bool MainWindow::getParamValueFromFileContentWithName(QString fileContent, QString paramName, QString &paramValue)
{
    int start;
    int end;
    paramValue = "";
    start =  fileContent.indexOf(QString("[%1]").arg(paramName));
    if(start == -1)
    {
        return false;
    }
    start = start +paramName.length()+2;
    end   =  fileContent.indexOf("\n",start);
    if(end == -1)
    {
        return false;
    }
    int endr   =  fileContent.indexOf("\r",start);
    if(endr >=0)
    {
       if((endr +1) == end )
       {
           end = endr;
       }
    }
    if(end<start)
    {
       return false;
    }
    paramValue = fileContent.mid(start,end-start);
    return true;
}
3、将objParam转换为一段字符串fileContent,用于后续将其写入txt文件
void MainWindow::param2FileContent(QString &fileContent, objParam *inputParam)
{
    QString str;
    int line = 0;//每一行转换后会多一个字节
    fileContent = "";

    str = inputParam->obj1Name;
    fileContent.append(QString("[OBJ1NAME]%1\n").arg(str));
    line++;
    str = QString::number(inputParam->obj1Steps,10);
    fileContent.append(QString("[OBJ1STEPS]%1\n").arg(str));
    line++;

    str = inputParam->obj2Name;
    fileContent.append(QString("[OBJ2NAME]%1\n").arg(str));
    line++;
    str = QString::number(inputParam->obj2Steps,10);
    fileContent.append(QString("[OBJ2STEPS]%1\n").arg(str));
    line++;

    str = inputParam->obj3Name;
    fileContent.append(QString("[OBJ3NAME]%1\n").arg(str));
    line++;
    str = QString::number(inputParam->obj3Steps,10);
    fileContent.append(QString("[OBJ3STEPS]%1\n").arg(str));
    line++;

    str = inputParam->obj4Name;
    fileContent.append(QString("[OBJ4NAME]%1\n").arg(str));
    line++;
    str = QString::number(inputParam->obj4Steps,10);
    fileContent.append(QString("[OBJ4STEPS]%1\n").arg(str));
    line++;

    str = inputParam->obj5Name;
    fileContent.append(QString("[OBJ5NAME]%1\n").arg(str));
    line++;
    str = QString::number(inputParam->obj5Steps,10);
    fileContent.append(QString("[OBJ5STEPS]%1\n").arg(str));
    line++;

    str = inputParam->obj6Name;
    fileContent.append(QString("[OBJ6NAME]%1\n").arg(str));
    line++;
    str = QString::number(inputParam->obj6Steps,10);
    fileContent.append(QString("[OBJ6STEPS]%1\n").arg(str));
    line++;

    //记录总长度,用于读取时校验
    int size = fileContent.size();
    str = QString("%1").arg(size);
    line++;
    size = size+ str.size()+9+line;
    fileContent.append(QString("[LENGTH]%1\n").arg(size));
    return;
}
4、将一段字符串转换为objParam
bool MainWindow::fileContent2Param(QString &fileContent, objParam *outputParam)
{
    bool ret = true;
    QString str;
    objParam tmpParam;

    // 文本长度校验
    if(getParamValueFromFileContentWithName(fileContent,QString("LENGTH"),str))
    {
        if(fileContent.size() != str.toInt() )
        {
            qDebug() << "lenth wrong";
            ret = false;
        }
    }
    else
    {
        qDebug() << "file contant wrong";
        ret = false;
    }
    // obj1
    if(getParamValueFromFileContentWithName(fileContent,QString("OBJ1NAME"),str))
    {
        tmpParam.obj1Name = str;
    }
    else
    {
        ret = false;
    }
    if(getParamValueFromFileContentWithName(fileContent,QString("OBJ1STEPS"),str))
    {
        tmpParam.obj1Steps = str.toInt();
    }
    else
    {
        ret = false;
    }
    // obj2
    if(getParamValueFromFileContentWithName(fileContent,QString("OBJ2NAME"),str))
    {
        tmpParam.obj2Name = str;
    }
    else
    {
        ret = false;
    }
    if(getParamValueFromFileContentWithName(fileContent,QString("OBJ2STEPS"),str))
    {
        tmpParam.obj2Steps = str.toInt();
    }
    else
    {
        ret = false;
    }
    // obj3
    if(getParamValueFromFileContentWithName(fileContent,QString("OBJ3NAME"),str))
    {
        tmpParam.obj3Name = str;
    }
    else
    {
        ret = false;
    }
    if(getParamValueFromFileContentWithName(fileContent,QString("OBJ3STEPS"),str))
    {
        tmpParam.obj3Steps = str.toInt();
    }
    else
    {
        ret = false;
    }
    // obj4
    if(getParamValueFromFileContentWithName(fileContent,QString("OBJ4NAME"),str))
    {
        tmpParam.obj4Name = str;
    }
    else
    {
        ret = false;
    }
    if(getParamValueFromFileContentWithName(fileContent,QString("OBJ4STEPS"),str))
    {
        tmpParam.obj4Steps = str.toInt();
    }
    else
    {
        ret = false;
    }
    // obj5
    if(getParamValueFromFileContentWithName(fileContent,QString("OBJ5NAME"),str))
    {
        tmpParam.obj5Name = str;
    }
    else
    {
        ret = false;
    }
    if(getParamValueFromFileContentWithName(fileContent,QString("OBJ5STEPS"),str))
    {
        tmpParam.obj5Steps = str.toInt();
    }
    else
    {
        ret = false;
    }
    // obj6
    if(getParamValueFromFileContentWithName(fileContent,QString("OBJ6NAME"),str))
    {
        tmpParam.obj6Name = str;
    }
    else
    {
        ret = false;
    }
    if(getParamValueFromFileContentWithName(fileContent,QString("OBJ6STEPS"),str))
    {
        tmpParam.obj6Steps = str.toInt();
    }
    else
    {
        ret = false;
    }

    if(ret == true)
    {
        *outputParam = tmpParam;
    }
    return ret ;
}

5、读出文件内容输出至objParam
bool MainWindow::readParamFromFile(objParam *param)
{
    QString fileContent;//文件内容
    //文件路径
    QString strFilePath = QCoreApplication::applicationDirPath() + QDir::separator() + "myObjParam.txt";
    QFileInfo fileInfo(strFilePath);
    if(fileInfo.exists()==false)
    {
        qDebug() << "file not exist";
        return false;
    }
    //读取文件内容
    QFile file;
    file.setFileName(strFilePath);
    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug() << "file opened failed";
        return false;
    }
    QByteArray data = file.readAll();
    fileContent = data.data();
    data.clear();
    file.close();

    objParam outpara;

    if(fileContent2Param(fileContent,&outpara) == false)
    {
       return false;
    }

    *param = outpara;

    return true;
}
6、将objParam参数保存至文件
bool MainWindow::writeParamToFile(objParam *param)
{
    QString toContent;
    param2FileContent(toContent, param);
    //读取文件
    QString strFilePath = QCoreApplication::applicationDirPath() + QDir::separator() + "myObjParam.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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值