QT 使用数据流方式读写结构体中文数据

想要在Qt中实现写后读的功能,我尝试了很多种,都需要费些时间来实现,最后找到了数据流读写结构体的方式,可以直接复制粘贴代码,搞清楚机制之后稍微改一改就可以,简单的读写如下所示

先在头文件定义

struct DBFinfo
{
    quint16    ID;
    char        name[8];//这里的8可以根据字符串长度增加
    uint16_t    freq;
};

再在源文件进行写和读的编写

void MainWindow::writeDataDBF()
{
    QFile fileName("./DBFinfo.dat");
    if(!fileName.open(QIODevice::WriteOnly))
    {
        qDebug()<<"failed";
        return;
    }
    QDataStream out(&fileName);

    DBFinfo dbf;
    dbf.freq = 6000;
    dbf.ID  = 12;
    char str[] = "hello";
    strcpy(dbf.name,str);

    //char *temp = new char[sizeof(DBFinfo)];
    char temp[sizeof(DBFinfo)];
    memcpy(temp,&dbf,sizeof(DBFinfo));
    out.writeBytes(temp,12);//这个12也是对字符串长度的约束,需要的字越多数字应越大

    //delete[] temp;
    fileName.close();
}
void MainWindow::readDataDBF()
{
    QFile fileName("./DBFinfo.dat");
    if(!fileName.open(QIODevice::ReadOnly))
    {
        qDebug()<<"failed";
        return;
    }
    QDataStream in(&fileName);
    uint dataSize = sizeof(DBFinfo);
    char* temp = new char[dataSize];
    in.readBytes(temp,dataSize);

    DBFinfo dd;
    memcpy(&dd,temp,dataSize);
    //dataSize 必须是uint变量
    qDebug()<< dd.ID;
    qDebug()<< dd.name;
    qDebug()<< dd.freq;
    fileName.close();
    delete[] temp;
}

由此可以实现输出结果为12 ,hello ,6000,可以自己先在Qt上实现一遍,体会一下

但这些只是针对数字和英文字符串的读写,若要用到中文,则会乱码,无法实现读写效果

因此,需要在读写过程中对字符串格式进行转化

  1. 写时需要对中文字符串进行QString到char*的转换,简例如下

QString s;
char *msg;
QByteArray ba = s.toLocal8Bit(); // toLocal8Bit 支持中文  
msg = ba.data();

注意:QByteArray ba = str.toLocal8Bit(); 这一步不能省略成msg=s.toLocal8Bit().data();

否则可能会出错!!!

同时还需要添加GBK码支持

#include <QTextCodec>//添加在源文件顶部
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));//读写的程序内都需添加

2.读时要将转化成char格式的中文字符串变回QString格式

QString str;
char *msg;
str = QString::fromLocal8Bit(msg);

调用fromLocal8bit就可以实现

最后,展示一下数据流读写与格式转换结合之后的代码,这里我直接用char name[]来操作

struct DBFinfo//头文件
{
    char  name[64];
};
void MainWindow::storage(void)//源文件
{
        QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
        QFile fileName("./DBFinfo.dat");
        if(!fileName.open(QIODevice::WriteOnly))
        {
            qDebug()<<"failed";
            return;
        }
        QDataStream out(&fileName);

        DBFinfo dbf;
        QString str = “想要存储的字符串”或.toString一下;
        char *str1;
        QByteArray ba = str.toLocal8Bit();//转换中文字符串部分
        str1 = ba.data();
        strcpy(dbf.name,str1);
        qDebug()<<"存储:"<<str;

        //char *temp = new char[sizeof(DBFinfo)];
        char temp[sizeof(DBFinfo)];
        memcpy(temp,&dbf,sizeof(DBFinfo));
        out.writeBytes(temp,64);//由于我需要的字符串比较长,这边直接拉的很大,保证不报错

        //delete[] temp;
        fileName.close();
}
void MainWindow::read(void)//源文件
{
        QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
        QFile fileName("./DBFinfo.dat");
        if(!fileName.open(QIODevice::ReadOnly))
        {
            qDebug()<<"failed";
            return;
        }
        QDataStream in(&fileName);
        uint dataSize = sizeof(DBFinfo);
        char* temp = new char[dataSize];
        in.readBytes(temp,dataSize);

        DBFinfo dd;
        memcpy(&dd,temp,dataSize);
        QString str2;
        str2=QString::fromLocal8Bit(dd.name);//转换中文字符串部分
        qDebug()<<"读取:"<< str2;
        //dataSize 必须是uint变量
        fileName.close();
        delete[] temp;
}

读写之后应用qDebug()进行对比,输出结果就是输入的字符串

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值