QDataStream写文件操作-writeBytes与writeRawData区别

Qt提供了非常方便的写文件操作QDataStream,可以使用流式操作来对数据进行读写,但Qt提供如此强大的功能的同时,也会付出一些额外的开销,在默认的流式写操作时,会附加一些Qt独有的数据内容,在这里进行了一些实验进行记录

QDataStream writeBytes与writeRawData区别

有次序列化文件时,要求需要写一个固定大小的char[256],无论有没有遇到\0都要写入char[256]内容,Qt下使用QDataStream是非常容易操作文件读写的,但,在写这个固定长度的char数组时还是遇到了一些小问题。

下面就讨论怎么样很好的把固定的char[256]这片区域写到文件中:

QDataStream有流式操作<<,对文件操作非常方便

首先看看最常见的流输出:

    void demo1(QFile& file)
    {
        qDebug()<<__FUNCTION__;
        if(file.open(QIODevice::WriteOnly))
        {
            QDataStream out(&file);
            char data[256];
            memset(data,0,256*sizeof(char));
            char* p = "this is QDataStream demo";
            strcpy(data,p);
            out<<data;
            file.close();
        }
        else
        {
            qDebug()<<file.errorString();
        }
    }

上诉代码生成的是这样的:

0000 0019 7468 6973 2069 7320 5144 6174 6153 7472 6561 6d20 6465 6d6f 00

显示的效果:

QDataStream有流式操作<<写入效果

这样很明显不会得到想要的效果,因为QDataStream遇到\0就自动结束了。而且前面还加了一些其他的内容。会有 00 00 00 19 (t的ASCII为74)

要写入完整的char数组查手册,发现有QDataStream::writeBytes函数,于是试试writeBytes:

    void demo2QDataStream(QFile& file)
    {
        qDebug()<<__FUNCTION__;
        if(file.open(QIODevice::WriteOnly))
        {
            QDataStream out(&file);
            char data[256];
            memset(data,0,256*sizeof(char));
            char* p = "this is QDataStream demo";
            strcpy(data,p);
            out.writeBytes(data,256);
            file.close();
        }
        else
        {
            qDebug()<<file.errorString();
        }

        if(file.open(QIODevice::ReadOnly))
        {
            QDataStream out(&file);
            char *data;
            uint len;
            out.readBytes(data,len);
            if(len > 0)
            {
                qDebug()<<data;
                delete[] data;
            }
            file.close();
        }
        else
        {
            qDebug()<<file.errorString();
        }
    }

此时生成的文件如下:
QDataStream::writeBytes写入效果
这时候,发现能完整的把char[256]写入到文件中,但前面的00 00 01 00是什么东西?

注意,使用writeBytes函数写的文件,必须用readBytes函数读取,readBytes函数是个工厂函数,会调用new[]分配内存,因此需要调用delete[] 进行删除内存,否则会泄露。

之前说的00 00 01 00是Qt特有的标示,用于Qt自身的验证,但要写一个通用点的文件,可以让别的环境也能很轻松的读取,需要用到另外一个函数int QDataStream::writeRawData(const char * s, int len)

int QDataStream::writeRawData(const char * s, int len)int QDataStream::readRawData(char * s, int len)函数配对使用,用于写入最原始的内存,如果不想要Qt独有的一些信息,就需要用这两个函数了:

    void demo3QDataStream(QFile& file)
    {
        qDebug()<<__FUNCTION__;
        if(file.open(QIODevice::WriteOnly))
        {
            QDataStream out(&file);
            char data[256];
            memset(data,0,256*sizeof(char));
            char* p = "this is QDataStream demo";
            strcpy(data,p);
            out.writeRawData(data,256);
            file.close();
        }
        else
        {
            qDebug()<<file.errorString();
        }

        if(file.open(QIODevice::ReadOnly))
        {
            QDataStream out(&file);
            char data[256];
            memset(data,1,256*sizeof(char));
            out.readRawData(data,256);
            qDebug()<<data;
            file.close();
        }
        else
        {
            qDebug()<<file.errorString();
        }
    }

上面代码输出:

这里写图片描述

生成的文件为:

这里写图片描述

就是我们想要的不加各种乱七八糟的头尾的原始二进制了

总结

在写出二进制时,如果需要仅仅写入原始的内存,记得使用int QDataStream::writeRawData(const char * s, int len)函数,而不是QDataStream::writeBytes函数!

  • 15
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘中远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值