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关联,还可以与QByteArray、QTcpSocket等多种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();
}