QDataStream数据流

QDataStream 、QTextStream 二者区别:
(1)QTextStream 类:用于对数据进行文本格式的读/写操作,可在 QString、QIODevice或 QByteArray 上运行,比如把数据输出到 QString、QIODevice 或 QByteArray 对象上,或进行相反的操作。
(2)QDataStream 类:用于对数据进行二进制格式的读/写操作,QDataStream 只可在QIODevice 或 QByteArray 上运行,因为 QString 只存放字符数据。

篇一:

QDataStream类实现将QIODevice的二进制数据串行化。一个数据流就是一个二进制编码信息流,独立于主机的操作系统,CPU或字节顺序。QDataStream可以实现c++的基本数据类型的串行化。

构造函数:

 

常用属性和方法

  • setDevice(): 设置 QDataStream 的设备,可以是 QFile、QIODevice 等。
  • setVersion(): 设置 QDataStream 的数据版本。
  • setFloatingPointPrecision(): 设置浮点数的精度。
  • readRawData()/writeRawData()/: 读/写入原始数据。
  • operator<<(): 将数据写入 QDataStream。
  • operator>>(): 从 QDataStream 读取数据。

写入和读取数据:


写入到文件中:

QFile file("D:/789.txt");
file.open(QIODevice::WriteOnly);
QDataStream stream(&file);
//串行化字符串
stream<< QString("abcdefg/n");
//串行化整数
stream<< (qint32)6;//写入数据
file.close();


读取文件中的内容:

QString str;
qint32 qin;
QFile file1("D:/789.txt");
file1.open(QIODevice::ReadOnly);
QDataStream in(&file1);
in >> str >>qin;//读取数据
qDebug()<< str;
qDebug()<< qin;
file1.close()


 使用函数读取和写入数据:

readRawData(char *s,int len)
writeRawData(const char* s,int len)
注意:这种方法需要自己解码

写入数据:

QFile file("D:/789.txt");
file.open(QIODevice::WriteOnly|QIODevice::Append);
QDataStream stream(&file);
stream.writeRawData("456456",6);
file.close();


 读取数据:

QFile file("D:/789.txt");
file.open(QIODevice::ReadOnly|QIODevice::Text);
QDataStream stream(&file);
stream.skipRawData(40);//跳过40个字节
char ch[10];
stream.readRawData(ch, 4);//读取数据
qDebug() << ch;
file.close();

                 
原文链接:https://blog.csdn.net/qq_45303986/article/details/128200640

篇二、QDataStream:使用指南、技巧与注意事项-CSDN博客

QDataStream是Qt框架中用于处理二进制数据序列化和反序列化的核心类。它提供了高效、跨平台的方式,将C++数据结构转化为字节流,便于在网络传输、持久化存储等场景下使用。本文将详尽解析QDataStream的使用方法、实用技巧以及在实际应用中应注意的问题。

一、QDataStream的基本使用
1. 初始化QDataStream
QFile file("data.bin");
if (file.open(QIODevice::ReadWrite)) {
    QDataStream stream(&file); // 将QDataStream与QFile关联
}

QDataStream不仅可以与QFile关联,还可以与QByteArrayQTcpSocket等多种QIODevice派生类关联,实现对多种数据源的读写操作。

2. 序列化与反序列化
序列化(写入数据)
QVector<int> numbers = {1, 2, 3, 4, 5};
stream << numbers;

QPoint point(10, 20);
stream << point;

反序列化(读取数据)
QVector<int> numbers;
stream >> numbers;

QPoint point;
stream >> point;

3. 格式版本控制
QDataStream支持格式版本控制,这对于跨版本兼容性非常重要:

stream.setVersion(QDataStream::Qt_5_15); // 设置数据流的版本

二、QDataStream使用技巧
数据对齐与大小端问题:QDataStream支持大小端转换,通过setByteOrder()函数可以设定字节序。

压缩与解压:虽然QDataStream本身不具备压缩功能,但可以配合QIODevice的子类(如QGzipDevice)实现数据压缩后再序列化。

自定义类型序列化:为自定义类型实现operator<<和operator>>,使其支持QDataStream操作。

三、注意事项
1. 数据格式一致性
确保在序列化和反序列化过程中,数据流的版本、字节序等设置保持一致。

2. 错误处理
在读写数据过程中,可能出现读取失败或格式不符等问题。因此,每次读写操作后,应当检查QIODevice的错误状态。

3. 数据边界问题
在序列化数组、容器等数据时,务必确保有足够的空间进行读写,以免发生内存溢出。

4. 数据类型的标识
在设计自定义数据结构时,若要在网络间传输,通常需要在数据头部添加类型标识字段,以便接收方知道如何解析收到的数据。

结语
QDataStream在Qt开发中扮演着至关重要的角色,尤其在处理二进制数据交换和持久化存储方面,具有显著优势。熟练掌握QDataStream的使用方法和技巧,既能保证数据传输的安全性和可靠性,又能有效提升程序性能。而在实际开发过程中,时刻关注上述注意事项,有助于预防潜在的运行时错误,提升程序的稳健性。                   
原文链接:https://blog.csdn.net/jason_thinking/article/details/137613929

篇三、

1、构造函数
1)、 QDataStream();
    QDataStream(QIODevice *d); //构造一个使用 I/O 设备 d 的数据流
2)、 QDataStream(QByteArray *a, QIODevice::OpenMode mode);
    QDataStream(const QByteArray &a);
构造一个在 QByteArray 上运行的数据流,其中 mode 表示打开模式(即只读、只写、读
写等模式),第 2 个函数只能是只读模式。
由于 QByteArray 不是 QIODevice 的子类,因此在内部会创建 QBuffer 来包装该对象。??

示例:使用 QDataStream 读/写二进制数据
以下示例读/写数据位于同一程序,实际应用时,读/写数据不一定在同一程序中。

#include<QtWidgets>
class B {public:int a;}; //自定义类

int main(int argc, char *argv[])
{ 
	QApplication aa(argc,argv);
	QWidget w; QPushButton *pb=new QPushButton("AAA",&w);
	
	QFile f("F:/1.txt"); 
	f.open(QIODevice::WriteOnly); //①、 以只写方式打开文本 1.txt
	QIcon i("F:/1i.png"); QPoint p(22,22); //准备读/写的两个对象 i 和 p
	B mb; mb.a=1; //自定义类型的对象
	QDataStream out(&f); //②、 创建 QDataStream 对象并与 QFile 对象关联
	out << i<< QString("BBB")<< p; //③、 把对象 i,字符串 BBB 和 对象 p 存入文件 1.txt 中,
	//读者可在 F 盘下找到 1.txt 文件以查看文件中的内容。
	//out<<mb; //错误,读/写自定义类型需重载>>和<<运算符(其方法详见后文)
	f.close(); //关闭文件
	
	f.open(QIODevice::ReadOnly); //④、 以只读方式重读打开文本 1.txt,以读取其内容
	QIcon i1; QString s; QPoint p1; //这些对象用于存储从文件读入的对象。
	QDataStream in(&f); //⑤、 创建 QDataStream 对象并与 QFile 对象关联
	in >> i1 >> s >> p1; //⑥、 把文件 1.txt 的内容读出并存储到 i1、 s 和 p1 中,
	//注意,读取数据类型的顺序应与写入时的一致
	//使用从文件读取到的数据设置按钮的图标,文本和位置
	pb->setIcon(i1); pb->setText(s); pb->move(p1);
	f.close(); 
	
	w.resize(400,333); w.show(); return aa.exec(); 
}

示例:使用 QDataStream 输入/输出 【自定义类型对象】

#include<QtWidgets>
//①、自定义类型,保存图标,文本和位置
class B {public: QIcon i; QString s; QPoint p; }; 
//②、 重载<<和>>运算符(注意,是全局重载的)
QDataStream &operator<<(QDataStream &out, const B &mb)
{
	out<< mb.i<< mb.s<< mb.p; 
	return out; //内部代码比较简单
} 
QDataStream &operator>>(QDataStream &in, B &mb)
{ 	
	in >> mb.i >> mb.s >>mb.p; 
	return in; 
}

int main(int argc, char *argv[])
{ 
	QApplication aa(argc,argv);
	QWidget w; QPushButton *pb=new QPushButton("AAA",&w);
	//③、 创建并初始化自定义类型对象mb
	B mb; mb.i=QIcon("F:/1i.png"); mb.s="BBB"; mb.p=QPoint(22,22);
	//④、 创建 QFile 对象并打开文件
	QFile f("F:/1.txt"); f.open(QIODevice::WriteOnly);
	QDataStream out(&f); //⑤、 创建 QDataStream 对象并与 QFile 对象关联
	out <<mb; //⑥、 把对象 mb 写入文件 1.txt
	f.close(); //⑦、 关闭文件
	
	//⑧、 读取文件内容
	f.open(QIODevice::ReadOnly);
	B mb1; QDataStream in(&f); 
	in >> mb1;//从文件 1.txt 中读取数据,到自定义类型对象mb1
	//⑨、 使用从文件 1.txt 读入的,用自定义对象mb1设置按钮的图标、文本和位置
	pb->setIcon(mb1.i); pb->setText(mb1.s);pb->move(mb1.p);
	w.resize(400,333); w.show(); return aa.exec(); 
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值