项目中程序需要保存用户配置参数,写了一个使用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 ¶mValue);
/*
* 将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 ¶mValue)
{
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;
}