QDataStream写文件操作-writeBytes与writeRawData区别
来源:互联网 发布:哪个直播软件有黄播 编辑:程序博客网 时间:2024/06/14 05:31
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
遇到\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(); } }
此时生成的文件如下:
这时候,发现能完整的把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
函数!
- QDataStream写文件操作-writeBytes与writeRawData区别
- WriteBytes
- 4.关于QT中的QFile文件操作,QBuffer,Label上添加QPixmap,QByteArray和QString之间的区别,QTextStream和QDataStream的区别,QT内存映射(
- 4.关于QT中的QFile文件操作,QBuffer,Label上添加QPixmap,QByteArray和QString之间的区别,QTextStream和QDataStream的区别,QT内存映射(
- QTextStream和QDataStream的区别
- QTextStream和QDataStream的区别
- QTextStream和QDataStream的区别
- QTextStream流与QDataStream流
- Qt模块化笔记之core——Input/Output文件操作-流QDataStream使用
- 文件的读与写操作
- Qt: QTextStream流与QDataStream流
- 文件操作 写文件
- RandomAccessFile 类中的 writeBytes/writeChars/writeUTF 方法区别
- 文件写操作
- yaffs2写文件操作
- php写文件操作
- JAVA 写文件操作
- java写文件操作
- caffe windows
- 获取直播流的sps信息
- 群体遗传学--哈温定律
- 秒杀活动倒计时 iOS代码实现
- Linux学习之十三(bash脚本编程之条件判断)
- QDataStream写文件操作-writeBytes与writeRawData区别
- Reverse Pairs
- iOS9自动布局神器StackView
- MFC中使用自定义资源
- layout_marginStart和layout_marginEnd
- 配置maven环境变量一定要配置JDK环境变量吗?
- C# 基础
- TK1学习笔记六:安装ROS
- maven项目pom.xml文件的构造