1.问题来源
近日在工作中使用qt读项目的所有配置文件中数据存在以十六进制的字符串形式存储,此时应该如何做到数据读取和数据转换。
2.解决思路
针对以上问题的解决思路:①写配置文件 ②读配置文件 ③依据配置文件中获取的数据加载其它文件数据 ④读取目标文件内的数据 ⑤将目标文件中的十六进制字符串转换成十进制放入内存
3.配置文件
在日常的工作中,有时候需要将部分信息保存到本地,也就是写入到INI文件中,便于下次使用;在Qt中可以使用QSetting来进行INI文件的读写。
QSettings 是对这些技术的抽象,使用户能够以可移植的方式保存和恢复应用程序设置。它还支持自定义存储格式。
QSettings 的 API 是基于 QVariant 的,可以让用户便捷地保存大多数基于值的类型,例如 QString、QRect 和 QImage。构造和销毁 QSettings 对象都非常快。如果在应用程序的许多地方使用 QSettings,可使用 QCoreApplication类指定组织名称和应用程序名称,然后使用默认的 QSettings ;
函数说明:QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr)
//用QSetting读入ini文件
QSettings *setconfig;
setconfig=new QSettings("E:/qt_test/FreqCalUiWidght/config.ini",QSettings::IniFormat);
filename是ini的文件路径,QSettings::IniFormat是构造QSetting结构,读取ini文件,并将文件读入内存中。
(1)读ini文件
csvpath=setconfig->value("path/csvpath").toString();
value是QSettings中读ini文件的函数,格式是“一级标题/二级标题”,value的返回值是QVariant,所以所以这里为了获取字符串所以需要用toString()进行一次格式转换。
(2)写ini文件
csvpath=setconfig->setValue("path/csvpath",0);
setValue是QSettings中写ini文件的函数,格式是“一级标题/二级标题”
4.CSV文件
使用QStringList及QTextStream实现CSV文件读写
适用于:对于小型数据量的CSV文件。
优点:
1.实现简单:使用QStringList和QTextStream实现CSV读写操作非常简单,能够快速上手;
2.代码量少:相对其他实现方式,该方法实现的代码量较少。
缺点:
1.写入数据顺序不能改变。
2.当数据量大的时候,使用该方法逐行写入文件,文件I/O开销相对较大,导致写入速度变慢。
3.同时,该实现方式要求数据顺序不能改变,因为每行数据只存储在单独的QStringList中。
//读csv文件
QList<QList<QVariant>> HandleProcess::ReadCSVFunc(QString filename)
{
QList<QList<QVariant>> m_varListList;
QFile file(filename);
if(!file.exists())
{
return m_varListList;
}
file.open(QFile::ReadOnly);
QTextStream in(&file);
QString strLine;
int i=0;
QList<QList<QVariant>> varListList;
while(!in.atEnd())
{
strLine =in.readLine();
strLine.remove("\r");
strLine.remove("\n");
QStringList strList;
if(strLine.contains(","))
{
strList = strLine.split(",",QString::KeepEmptyParts);
}
else if(strLine.contains(" "))
{
strList = strLine.split(" ",QString::KeepEmptyParts);
}
else if(strLine.contains("\t"))
{
strList = strLine.split("\t",QString::KeepEmptyParts);
}
QList<QVariant> varList;
foreach(QString str,strList)
{
varList.append(QVariant(str));
}
varListList.append(varList);
i++;
}
file.close();
m_varListList=varListList;
return m_varListList;
}
readline()按行读取文件。
以remove("/r")为例,是将此行中的/r移除。
QtSplit函数最基本的用法就是将一个字符串按照指定分隔符进行分割,分割结果会以QList的方式返回。split()是移除分隔符,QStriing::KeepEmptyParts是移除分隔符后以空保留。
5.读取csv后对数据进行转换
有一项数据是将数据转换成十六进制的字符串格式存储在文件中,在做数据处理时需要读入数据并将数据从字符串转换成十六进制,再转换成十进制。
QByteArray temp=QByteArray::fromHex(csvlist[i].toByteArray());
temp=temp.toHex();
bool ok;
double temp1=temp.toInt(&ok,16);
QList<double> data;
data.append(temp1);
先将存储在QList<Varient> csvlist中的数据放入QByteArray的变量中,变量自转换成16进制,即完成字符串转换成十六进制这一步。此后按需要的变量类型,将数据从16进制转换成10进制。