Qt之文件保存的技巧

今天偷懒做法,在保存文件的时候,直接把结构体写进了文件中,结果发现,这样打开文件的话读取到的都是二进制,如果其他人不知道你的结构体排布,这不也是相当于一种文件加密了嘛,具体实现是这样的

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类型的数组来存放的,如果你读取文件,此时你直接将文件内容写入结构体,并不能对应的得到你想要的数据反而会出现异常,如果你是固定的大小那么就没有问题

所以我重新教一个办法,只需要将文件内容压缩后再写入文件即可

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值