今天偷懒做法,在保存文件的时候,直接把结构体写进了文件中,结果发现,这样打开文件的话读取到的都是二进制,如果其他人不知道你的结构体排布,这不也是相当于一种文件加密了嘛,具体实现是这样的
1、老办法:
//这种方法下文件内容打开就能看见,安全性非常差
QFile f(filepath);
QTextStream txtOutput(&f);
txtOutput.setCodec("UTF-8");
if(f.open(QIODevice::WriteOnly | QIODevice::Text)){
txtOutput <<"Root: Hello world!!!" <<endl;
f.close();
}
2、新方法
typedef struct {
QString data;
}FileData;
// 写文件
QFile f(filepath);
if(f.open(QIODevice::WriteOnly | QIODevice::Text)){
FileData filedata;
filedata.data = "Root: Hello world!!!";
f.write((const char *)&filedata,sizeof(filedata));
f.close();
}
//读文件
QFile f(filepath);
FileData filedata;
if(f.open(QIODevice::ReadOnly)){
QByteArray ba = f.readAll();
memcpy(&filedata,ba,sizeof(filedata));
f.close();
}
唉,真的是越简单越想不到,这种方法还方便了读取文件时的管理,以前自己还把文件内容加密,却忽视了这么简单的方法
追加:我这是没有试验过的代码,我后面发现,我之前这种可以是因为我的结构体的申请空间是固定的,而如果你的结构体空间不是固定的,你就会出现异常,例如上面的结构体
typedef struct {
QString data;
QString name;
QString path;
QString date;
int size;
}FileData;
那么你直接写入文件中之后再打开就会出现异常,因为Qt内部对于QString的赋值操作是动态申请char类型的数组来存放的,如果你读取文件,此时你直接将文件内容写入结构体,并不能对应的得到你想要的数据反而会出现异常,如果你是固定的大小那么就没有问题
所以我重新教一个办法,只需要将文件内容压缩后再写入文件即可