碰到一个需求,结构体数据需要保存下来,以便下次程序打开后再次加载。结构体存在嵌套。
查找资料,确认可以通过文件的读写进行操作,FILE,fread和fwrite可以实现,以下是测试代码(使用模板实现相关功能)
核心部分是
template <class T>
void write_dataToFile( T *t, const char *filePath)
template <class T>
void read_dataFromFile(T* t, const char *filePath)
两个文件,主要是利用了FILE的读写操作,注意,此方法可能存在瑕疵,文件的size依赖于平台,如果在A平台生成(写)的文件,在B平台可能会解析(读)错误。
#include <QApplication>
#include <QtDebug>
#include <stdio.h>
#include <errno.h>
#include <string.h>
enum ENUMT{
DI = 0,
DO,
DP
};
struct Info_C{
QString name = "1212";
double age = 12.32323;
};
struct Info{
QString name = "ddsdsd";
int age = 0;
ENUMT enumT = DI;
Info_C info_c;
};
template <class T>
void write_dataToFile( T *t, const char *filePath)
{
FILE *fp = nullptr;
fp = fopen(filePath, "w+");
if (nullptr == fp)
{
printf("open failure ,filePath : %s, errno: %d", filePath, errno);
qDebug("open failure ,filePath : %s, errno: %d", filePath, errno);
return;
}
fwrite(t, sizeof(T), 1, fp);
fclose(fp);
}
template <class T>
void read_dataFromFile(T* t, const char *filePath)
{
FILE *fp = fopen(filePath, "r");
if (nullptr == fp)
{
printf("open failure ,filePath : %s, errno: %d", filePath, errno);
qDebug("open failure ,filePath : %s, errno: %d", filePath, errno);
return;
}
fread(t, sizeof(T), 1, fp);
fclose(fp);
}
using namespace hv;
int main(int argc, char *argv[])
{
//读写基本类型
Info writeInfo;
writeInfo.name = "baseType";
writeInfo.age = 18;
writeInfo.enumT = DO;
write_dataToFile(&writeInfo,"./info.txt");
Info readInfo;
read_dataFromFile(&readInfo,"./info.txt");
qDebug()<<readInfo.name<<readInfo.age<<readInfo.enumT;
//读写容器,vector
QVector<QString> vec;
vec.push_back("vec_base1");
vec.push_back("vec_base2");
vec.push_back("vec_base3");
write_dataToFile(&vec,"./info1.txt");
QVector<QString> vec11;
read_dataFromFile(&vec11,"./info1.txt");
qDebug("read:%d\n", vec11.count());
if(vec11.count() > 2)
qDebug()<<vec11.at(2);
//读写容器结构体-包含嵌套
QVector<Info> vec_stu;
Info stu;
stu.name = "vec_stu1";
stu.age = 18;
stu.enumT = DO;
vec_stu.push_back(stu);
Info stu1;
stu1.name = "vec_stu2";
stu1.age = 100;
stu1.enumT = DI;
stu1.info_c.age = 43.434;
stu1.info_c.name = "vec_stu_stu";
vec_stu.push_back(stu1);
write_dataToFile(&vec_stu,"./info11.txt");
QVector<Info> vec_stu11;
read_dataFromFile(&vec_stu11,"./info11.txt");
qDebug("read vector stu:%d\n", vec_stu11.count());
if(vec_stu11.count() > 1){
qDebug()<<vec_stu11.at(1).name<<vec_stu11.at(1).info_c.age<<vec_stu11.at(1).info_c.name;
}
return 0;
}
结果示意图,可正常的进行读取。