QDataStream类
QDataStream类提供了将二进制数据序列化到QIODevice的功能。 更多...
头文件 | #include <QDataStream> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
继承 | QIODeviceBase |
- 成员列表,包含继承的成员
- QDataStream是输入/输出和网络的一部分。
注意:此类中所有函数都是可重入的。
公共类型
enum | ByteOrder { BigEndian, LittleEndian } |
enum | FloatingPointPrecision { SinglePrecision, DoublePrecision } |
enum | Status { Ok, ReadPastEnd, ReadCorruptData, WriteFailed, SizeLimitExceeded } |
enum | Version { Qt_1_0, Qt_2_0, Qt_2_1, Qt_3_0, Qt_3_1, …, Qt_6_7 } |
公共函数
QDataStream() | |
QDataStream(QIODevice *d) | |
QDataStream(QByteArray *a, QIODeviceBase::OpenMode mode) | |
QDataStream(const QByteArray &a) | |
~QDataStream() | |
void | abortTransaction() |
bool | atEnd() const |
QDataStream::ByteOrder | byteOrder() const |
bool | commitTransaction() |
QIODevice * | device() const |
QDataStream::FloatingPointPrecision | floatingPointPrecision() const |
(since 6.7) QDataStream & | readBytes(char *&s, qint64 &l) |
qint64 | readRawData(char *s, qint64 len) |
void | resetStatus() |
void | rollbackTransaction() |
void | setByteOrder(QDataStream::ByteOrder bo) |
void | setDevice(QIODevice *d) |
void | setFloatingPointPrecision(QDataStream::FloatingPointPrecision precision) |
void | setStatus(QDataStream::Status status) |
void | setVersion(int v) |
qint64 | skipRawData(qint64 len) |
void | startTransaction() |
QDataStream::Status | status() const |
int | version() const |
QDataStream & | writeBytes(const char *s, qint64 len) |
qint64 | writeRawData(const char *s, qint64 len) |
QDataStream & | 运算符<<(qint8 i) |
QDataStream & | 运算符<<(quint8 i) |
QDataStream & | 运算符<<(qint16 i) |
QDataStream & | 运算符<<(quint16 i) |
QDataStream & | 运算符<<(qint32 i) |
QDataStream & | 运算符<<(quint32 i) |
QDataStream & | 运算符<<(qint64 i) |
QDataStream & | 运算符<<(quint64 i) |
QDataStream & | 运算符<<(std::nullptr_t ptr) |
QDataStream & | 运算符<<(bool i) |
QDataStream & | 运算符<<(float f) |
QDataStream & | 运算符<<(double f) |
QDataStream & | 运算符<<(const char *s) |
(since 6.0) QDataStream & | 运算符<<(char16_t c) |
(since 6.0) QDataStream & | 运算符<<(char32_t c) |
QDataStream & | 运算符>>(qint8 &i) |
QDataStream & | 运算符>>(quint8 &i) |
QDataStream & | 运算符>>(qint16 &i) |
QDataStream & | 运算符>>(quint16 &i) |
QDataStream & | 运算符>>(qint32 &i) |
QDataStream & | 运算符>>(quint32 &i) |
QDataStream & | 运算符>>(qint64 &i) |
QDataStream & | 运算符>>(quint64 &i) |
QDataStream & | 运算符>>(std::nullptr_t &ptr) |
QDataStream & | 运算符>>(bool &i) |
QDataStream & | 运算符>>(float &f) |
QDataStream & | 运算符>>(double &f) |
QDataStream & | 运算符>>(char *&) |
(since 6.0) QDataStream & | 运算符>>(char16_t &c) |
(since 6.0) QDataStream & | 运算符>>(char32_t &c) |
相关非成员
(since 6.0) QDataStream & | 运算符<<(QDataStream &out, const std::pair<T1, T2> &pair) |
(since 6.0) QDataStream & | 运算符>>(QDataStream &in, std::pair<T1, T2> &pair) |
详细描述
数据流是编码信息的一个二元流,与宿主计算机的操作系统、CPU或字节顺序完全独立。例如,在Windows下由PC编写的流可以被运行在Solaris上的Sun SPARC读取。
您还可以使用数据流来读取/写入原始未编码的二进制数据。如果您需要一个“解析”输入流,请参见QTextStream。
QDataStream类实现了C++基本数据类型的序列化,如char
、short
、int
、char *
等。复杂数据的序列化是通过将数据分解成原始单元来实现的。
数据流与QIODevice紧密合作。QIODevice表示一个可以从中读取数据并写入数据的中介。例如,QFile类是一个I/O设备。
示例(将二进制数据写入流)
QFile file("file.dat"); file.open(QIODevice::WriteOnly); QDataStream out(&file); // we will serialize the data into the file out << QString("the answer is"); // serialize a string out << (qint32)42; // serialize an integer
示例(从流中读取二进制数据)
QFile file("file.dat"); file.open(QIODevice::ReadOnly); QDataStream in(&file); // read the data serialized from the file QString str; qint32 a; in >> str >> a; // extract "the answer is" and 42
写入流中的每个项都是以预定义的二元格式编写的,具体取决于项的类型。支持的 Qt 类型包括 QBrush、QColor、QDateTime、QFont、QPixmap、QString、QVariant 以及许多其他类型。有关所有支持数据流的 Qt 类型的完整列表,请查看 序列化 Qt 数据类型。
对于整数,最好是始终将其转换为 Qt 整数类型以进行写入,并从中读取相同的 Qt 整数类型。这确保您得到所需大小的整数,并且可以防止编译器和平台差异。
枚举可以通过 QDataStream 序列化,无需手动定义流操作符。枚举类使用声明的尺寸进行序列化。
初始的 I/O 设备通常在构造函数中设置,但可以使用 setDevice() 进行更改。如果您已到达数据的末尾(或未设置 I/O 设备)atEnd() 将返回 true。
序列化容器和字符串
序列化格式以长度指定符开始,然后是 l 字节数据。如果版本小于 6.7 或元素数量小于 0xfffffffe(2^32 -2),则长度指定符为 quint32。否则,有一个扩展值 0xfffffffe,后跟一个 quint64 以表示实际值。此外,对于支持 isNull() 的容器,它编码为一个设置了所有位且没有数据的单 quint32。
以字符串大小为例,如果大小可以容纳在 32 位中,则 char *
字符串以 32 位整数写入,等于字符串的长度,包括 '\0' 字节,后跟所有字符,包括 '\0' 字节。如果字符串大小较大,则写入值 0xffffffffe 作为扩展大小的标记,后跟实际的 64 位大小。在读取 char *
字符串时,首先读取 4 字节。如果值不等于 0xffffffffe(扩展大小标记),则这些 4 字节被视为字符串的 32 位大小。否则,读取接下来的 8 字节并将其视为字符串的 64 位大小。然后,读取 char *
字符串的所有字符,包括 '\0' 终止符。
版本号
QDataStream 的二进制格式自 Qt 1.0 以来已发展,预计将继续发展以反映 Qt 中的更改。当输入或输出复杂类型时,确保用于读取和写入的流(version())的版本相同非常重要。如果您需要前向和向后兼容性,可以在应用程序中硬编码版本号。
stream.setVersion(QDataStream::Qt_4_0);
如果您正在创建新的二进制数据格式,例如您的应用程序创建的文档的文件格式,您可以使用 QDataStream 以可移植的格式写入数据。通常,您会写一个包含魔法字符串和版本号的简短标题,为未来的扩展留出空间。例如
QFile file("file.xxx"); file.open(QIODevice::WriteOnly); QDataStream out(&file); // Write a header with a "magic number" and a version out << (quint32)0xA0B0C0D0; out << (qint32)123; out.setVersion(QDataStream::Qt_4_0); // Write the data out << lots_of_interesting_data;
然后按照如下方式进行读取
QFile file("file.xxx"); file.open(QIODevice::ReadOnly); QDataStream in(&file); // Read and check the header quint32 magic; in >> magic; if (magic != 0xA0B0C0D0) return XXX_BAD_FILE_FORMAT; // Read the version qint32 version; in >> version; if (version < 100) return XXX_BAD_FILE_TOO_OLD; if (version > 123) return XXX_BAD_FILE_TOO_NEW; if (version <= 110) in.setVersion(QDataStream::Qt_3_2); else in.setVersion(QDataStream::Qt_4_0); // Read the data in >> lots_of_interesting_data; if (version >= 120) in >> data_new_in_XXX_version_1_2; in >> other_interesting_data;
在序列化数据时,您可以选择使用的字节顺序。默认设置为 big-endian(最高有效位优先)。将其更改为 little-endian 会破坏可移植性(除非读取器也改为 little-endian)。我们建议除非您有特殊要求,否则请保持此设置。
读取和写入原始二进制数据
您可能希望建立自己的对数据流的原始二进制数据进行读写。可以使用 readRawData() 从流中读取数据到预分配的 char *
中;同样,可以使用 writeRawData() 将数据写入流中。请注意,数据的任何编码/解码都必须由您完成。
有一对类似的函数是 readBytes() 和 writeBytes()。它们与它们的 raw 形式相比有以下区别:readBytes() 读入一个 quint32,这个数字被视为要读取的数据长度,然后将这么多字节读取到预分配的 char *
中;writeBytes() 写入一个 quint32,它包含数据的长度,然后是数据。请注意,数据的任何编码/解码(除了长度 quint32)都必须由您完成。
阅读和写入 Qt 集合类
Qt 容器类也可以序列化到 QDataStream 中。这包括 QList、QSet、QHash 和 QMap。流运算符是在类的非成员中声明的。
阅读和写入其他 Qt 类
除了这里记录的重载流运算符之外,您可能希望将任何 Qt 类序列化到 QDataStream 的类都将声明适当的流运算符,作为类的非成员
QDataStream &operator<<(QDataStream &, const QXxx &); QDataStream &operator>>(QDataStream &, QXxx &);
例如,以下是作为非成员声明在 QImage 类中的流运算符
QDataStream &operator<<(QDataStream &stream, const QImage &image); QDataStream &operator>>(QDataStream &stream, QImage &image);
要查看您喜欢的 Qt 类是否有类似的流运算符定义,请检查类文档页面的相关非成员部分。
使用读事务
当数据流在异步设备上操作时,数据块可随时到达。QDataStream 类实现了一种事务机制,它提供了一组流运算符以原子方式读取数据的能力。例如,您可以使用连接到 readyRead() 信号的槽来处理来自套接字的未完成读取
in.startTransaction(); QString str; qint32 a; in >> str >> a; // try to read packet atomically if (!in.commitTransaction()) return; // wait for more data
如果没有接收到完整的包,此代码将流恢复到起始位置;之后您需要等待更多数据到达。
损坏和安全
QDataStream 对损坏的数据输入缺乏弹性,因此不能用于安全敏感的情况,即使在使用事务时也是如此。事务将有助于确定可以使用异步设备上当前可用的数据对有效输入进行解码,但将假设可用数据是正确构成的。
此外,许多 QDataStream 反序列化运算符将基于流中的信息分配内存。这些运算符不验证请求的内存量是否合理或是否与流中的数据量兼容(例如:反序列化一个 QByteArray 或 QString 可能会看到为分配数个 GB 数据的请求)。
QDataStream 不应用于来源不可信的内容。应用程序应设计为试图解码来源至少与本身或其插件一样可信赖的流。
另请参阅QTextStream 和 QVariant。
成员类型文档
enum QDataStream::ByteOrder
用于读取/写入数据的字节序。
常量 | 值 | 描述 |
---|---|---|
QDataStream::BigEndian | QSysInfo::BigEndian | 最高有效字节先(默认) |
QDataStream::LittleEndian | QSysInfo::LittleEndian | 最低有效字节先 |
枚举 QDataStream::FloatingPointPrecision
用于读取/写入数据的浮点数的精度。只有当数据流的版本为 Qt_4_6 或更高版本时,这才会产生影响。
警告:浮点精度必须在写入数据流的对象和读取数据流的对象上设置相同的值。
常量 | 值 | 描述 |
---|---|---|
QDataStream::SinglePrecision | 0 | 数据流中的所有浮点数具有32位精度。 |
QDataStream::DoublePrecision | 1 | 数据流中的所有浮点数具有64位精度。 |
另请参阅setFloatingPointPrecision() 和 floatingPointPrecision。
枚举 QDataStream::Status
此枚举描述数据流的当前状态。
常量 | 值 | 描述 |
---|---|---|
QDataStream::Ok | 0 | 数据流正常运行。 |
QDataStream::ReadPastEnd | 1 | 数据流已读取底层设备中的数据末尾。 |
QDataStream::ReadCorruptData | 2 | 数据流已读取损坏的数据。 |
QDataStream::WriteFailed | 3 | 数据流无法写入底层设备。 |
QDataStream::SizeLimitExceeded (since Qt 6.7) | 4 | 数据流无法读取或写入数据,因为其大小超出了当前平台支持的范围。例如,在32位平台上尝试读取超过2 GiB的数据时可能会发生这种情况。 |
枚举 QDataStream::Version
此枚举为数据序列化格式版本号提供符号同义词。
常量 | 值 | 描述 |
---|---|---|
QDataStream::Qt_1_0 | 1 | 版本 1(Qt 1.x) |
QDataStream::Qt_2_0 | 2 | 版本 2(Qt 2.0) |
QDataStream::Qt_2_1 | 3 | 版本 3(Qt 2.1,2.2,2.3) |
QDataStream::Qt_3_0 | 4 | 版本 4(Qt 3.0) |
QDataStream::Qt_3_1 | 5 | 版本 5(Qt 3.1,3.2) |
QDataStream::Qt_3_3 | 6 | 版本 6(Qt 3.3) |
QDataStream::Qt_4_0 | 7 | 版本 7(Qt 4.0,Qt 4.1) |
QDataStream::Qt_4_1 | Qt_4_0 | 版本 7(Qt 4.0,Qt 4.1) |
QDataStream::Qt_4_2 | 8 | 版本 8(Qt 4.2) |
QDataStream::Qt_4_3 | 9 | 版本 9(Qt 4.3) |
QDataStream::Qt_4_4 | 10 | 版本 10(Qt 4.4) |
QDataStream::Qt_4_5 | 11 | 版本 11(Qt 4.5) |
QDataStream::Qt_4_6 | 12 | 版本 12(Qt 4.6,Qt 4.7,Qt 4.8) |
QDataStream::Qt_4_7 | Qt_4_6 | 与 Qt_4_6 相同。 |
QDataStream::Qt_4_8 | Qt_4_7 | 与 Qt_4_6 相同。 |
QDataStream::Qt_4_9 | Qt_4_8 | 与 Qt_4_6 相同。 |
QDataStream::Qt_5_0 | 13 | 版本 13(Qt 5.0) |
QDataStream::Qt_5_1 | 14 | 版本 14(Qt 5.1) |
QDataStream::Qt_5_2 | 15 | 版本 15(Qt 5.2) |
QDataStream::Qt_5_3 | Qt_5_2 | 与 Qt_5_2 相同。 |
QDataStream::Qt_5_4 | 16 | 版本 16(Qt 5.4) |
QDataStream::Qt_5_5 | Qt_5_4 | 与 Qt_5_4 相同。 |
QDataStream::Qt_5_6 | 17 | 版本 17(Qt 5.6) |
QDataStream::Qt_5_7 | Qt_5_6 | 与 Qt_5_6 相同。 |
QDataStream::Qt_5_8 | Qt_5_7 | 与 Qt_5_6 相同。 |
QDataStream::Qt_5_9 | Qt_5_8 | 与 Qt_5_6 相同。 |
QDataStream::Qt_5_10 | Qt_5_9 | 与 Qt_5_6 相同。 |
QDataStream::Qt_5_11 | Qt_5_10 | 与 Qt_5_6 相同。 |
QDataStream::Qt_5_12 | 18 | 版本 18(Qt 5.12) |
QDataStream::Qt_5_13 | 19 | 版本 19(Qt 5.13) |
QDataStream::Qt_5_14 | Qt_5_13 | 与 Qt_5_13 相同。 |
QDataStream::Qt_5_15 | Qt_5_14 | 与 Qt_5_13 相同。 |
QDataStream::Qt_6_0 | 20 | 版本 20(Qt 6.0) |
QDataStream::Qt_6_1 | Qt_6_0 | 与 Qt_6_0 相同。 |
QDataStream::Qt_6_2 | Qt_6_0 | 与 Qt_6_0 相同。 |
QDataStream::Qt_6_3 | Qt_6_0 | 与 Qt_6_0 相同。 |
QDataStream::Qt_6_4 | Qt_6_0 | 与 Qt_6_0 相同。 |
QDataStream::Qt_6_5 | Qt_6_0 | 与 Qt_6_0 相同。 |
QDataStream::Qt_6_6 | 21 | 版本 21(Qt 6.6) |
QDataStream::Qt_6_7 | 22 | 版本 22(Qt 6.7) |
另请参阅 setVersion() 和 version()。
成员函数文档
QDataStream::QDataStream()
构造一个不包含I/O设备的数据流。
另请参阅 setDevice()。
[显式]
QDataStream::QDataStream(QIODevice *d)
构造一个使用I/O设备 d 的数据流。
QDataStream::QDataStream(QByteArray *a, QIODeviceBase::OpenMode mode)
构造一个在字节缓冲区 a 上操作的数据流。 mode 描述了如何使用设备。
或者,如果您只想从字节缓冲区中读取,可以使用 QDataStream(const QByteArray &)。
由于 QByteArray 不是一个 QIODevice 子类,内部将创建一个 QBuffer 来封装字节缓冲区。
QDataStream::QDataStream(const QByteArray &a)
构造一个在字节缓冲区 a 上操作的可读数据流。如果想要向字节缓冲区写入,请使用 QDataStream(QByteArray*, int)。
由于 QByteArray 不是一个 QIODevice 子类,内部将创建一个 QBuffer 来封装字节缓冲区。
[noexcept]
QDataStream::~QDataStream()
销毁数据流。
析构函数不会影响当前的I/O设备,除非它是一个内部I/O设备(例如一个 QBuffer)处理在构造函数中传入的 QByteArray,在这种情况下,内部I/O设备将被销毁。
void QDataStream::abortTransaction()
终止一个读取事务。
此函数通常用于在高级协议错误或流同步丢失后丢弃事务。
如果在一个内部事务上调用此函数,终止将委托给最外层事务,并且随后开始的所有内部事务将强制失败。
对外层事务而言,将丢弃恢复点以及流内的任何内部复制数据。不会影响流的当前读取位置。
将数据流的状况设置为
常量 | 描述 |
---|---|
ReadCorruptData | . |
另请参阅 startTransaction()、commitTransaction() 和 rollbackTransaction()。
QDataStream::ByteOrder QDataStream::byteOrder() const
如果I/O设备已达到末尾位置(流或文件的末尾)或未设置I/O设备,则返回 true
;否则返回 false
。
另请参阅 QIODevice::atEnd()。
QDataStream::ByteOrder QDataStream::byteOrder() const
返回当前的字节顺序设置 - 要么是 BigEndian,要么是 LittleEndian。
另请参阅 setByteOrder()。
bool QDataStream::commitTransaction()
完成一次读取事务。如果在事务过程中没有发生读取错误,则返回 true
;否则返回 false
。
如果在一个内部事务上调用,提交将推迟到最外层的 commitTransaction()、rollbackTransaction 或 abortTransaction() 调用发生。
否则,如果流状态表示已经读取到数据末尾,该函数将把流数据恢复到 startTransaction() 调用点。在这种情况下,需要等待更多数据的到达,然后重新开始一个新的事务。如果数据流读取了损坏的数据或任何内部事务被终止,此函数将终止事务。
另请参阅startTransaction()、rollbackTransaction() 和 abortTransaction()。
QIODevice *QDataStream::device() const
返回当前设置的 I/O 设备,如果没有设置设备,则返回 nullptr
。
另请参阅 setDevice()。
QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision() const
返回数据流的浮点精度。
另请参阅FloatingPointPrecision 和 setFloatingPointPrecision()。
[since 6.7]
QDataStream &QDataStream::readBytes(char *&s, qint64 &l)
从流中读取缓冲区 s 并返回对流的引用。
缓冲区 s 使用 new []
分配。使用 delete []
操作符销毁它。
l 参数被设置为缓冲区的长度。如果读取的内容为空,l 被设置为 0,s 被设置为 nullptr
。
序列化格式是一个长度指定符,然后是 l 字节的数据。如果版本小于 6.7 或元素数量小于 0xfffffffe(2^32 -2),长度指定符为一个 quint32,否则有一个扩展值 0xfffffffe 后跟一个 quint64 实际值。对于支持 isNull() 的容器,它被编码为一个所有位都设置的单个 quint32,没有数据。
此函数自 Qt 6.7 引入。
另请参阅readRawData() 和 writeBytes()。
qint64 QDataStream::readRawData(char *s, qint64 len)
从流中读取最多 len 字节到 s 并返回读取的字节数。如果发生错误,此函数返回 -1。
缓冲区 s 必须预先分配。数据不会被解码。
另请参阅readBytes()、QIODevice::read() 和 writeRawData()。
void QDataStream::resetStatus()
重置数据流的状况。
另请参阅 Status,status() 和 setStatus。
void QDataStream::rollbackTransaction()
撤销一个读取事务。
此函数通常用于在提交事务前检测到读取不完整时回滚事务。
如果在内部事务上调用,撤销会被委托给最外层事务,并且随后开始的内部事务将被迫失败。
对于最外层事务,将流数据恢复到 startTransaction() 调用的点。如果数据流已读取损坏的数据或任何内部事务已中止,则此函数中止事务。
如果前面的流操作成功,设置数据流的状态为
常量 | 描述 |
---|---|
ReadPastEnd | . |
另请参阅 startTransaction,commitTransaction 和 abortTransaction。
void QDataStream::setByteOrder(QDataStream::ByteOrder bo)
设置序列化字节顺序为 bo。
bo 参数可以是 QDataStream::BigEndian 或 QDataStream::LittleEndian。
默认设置是大端。我们不推荐更改此设置,除非您有特殊要求。
另请参阅 byteOrder。
void QDataStream::setDevice(QIODevice *d)
void QDataStream::setDevice(QIODevice *d)
设置 I/O 设备为 d,它可以是 nullptr
以取消当前 I/O 设备的设置。
另请参阅 device。
void QDataStream::setFloatingPointPrecision(QDataStream::FloatingPointPrecision precision)
将数据流的浮点精度设置为 precision。如果浮点精度是 DoublePrecision 而数据流的版本是 Qt_4_6 或更高版本,所有浮点数将以 64 位精度写入和读取。如果浮点精度是 SinglePrecision 且版本是 Qt_4_6 或更高版本,所有浮点数将以 32 位精度写入和读取。
对于先于 Qt_4_6 的版本,数据流中浮点数的精度取决于调用的流操作符。
默认是 DoublePrecision。
请注意,此属性不影响 qfloat16
实例的序列化或反序列化。
警告: 此属性必须在写入和读取数据流的对象上设置为相同的值。
另请参阅 floatingPointPrecision。
void QDataStream::setStatus(QDataStream::Status status)
将数据流的状态设置为提供的 status。
在调用 resetStatus() 方法之前,所有对 setStatus() 的后续调用均被忽略。
另请参阅 Status,status() 和 resetStatus。
void QDataStream::setVersion(int 版本号)
将数据序列化格式的版本号设置为指定的 版本号,这是一组 Version 枚举值的其中一个。
如果您正在使用 Qt 的当前版本,则不必设置版本号,但为了您自己的自定义二进制格式,我们建议您这样做;请参阅详细描述中的 Versioning。
为了适应新的功能,Qt 一些类在各个版本中的数据流序列化格式可能已发生变化。如果您想读取由 Qt 更早版本创建的数据,或写入可由使用 Qt 更早版本编译的程序读取的数据,请使用此函数来修改由 QDataStream 使用的序列化格式。
Version 枚举提供了不同 Qt 版本的符号常数。例如
QDataStream out(file); out.setVersion(QDataStream::Qt_4_0);
qint64 QDataStream::skipRawData(qint64 长度)
跳过设备的 长度 字节。返回实际上跳过的字节数,或在出错时返回 -1。
这与在长度为 长度 的缓冲区上调用 readRawData() 并忽略该缓冲区等效。
另请参阅 QIODevice::seek。
void QDataStream::startTransaction()
在流上开始新的读取事务。
在读取操作序列中定义了可以恢复的点。对于顺序设备,读取的数据将在内部复制,以便在不完整的读取的情况下进行恢复。对于随机访问设备,此函数保存流的当前位置。通过调用 commitTransaction()、rollbackTransaction 或 abortTransaction() 来完成当前事务。
一旦启动了事务,后续对此函数的调用将使事务递归。内部事务作为最外层事务的代理(即,向最外层事务报告读取操作的状态,最外层事务可以恢复流的当前位置)。
注意:不支持恢复到嵌套启动事务调用的地方。
在事务期间(包括内部事务失败)发生错误时,从数据流中读取将暂停(所有后续的读取操作返回空/零值),并强制后续内部事务失败。启动新的最外层事务可以从这种状态恢复。这种行为使得不必单独错误检查每个读取操作。
另请参阅 commitTransaction、rollbackTransaction 和 abortTransaction。
QDataStream::Status QDataStream::status() const
返回数据流的当前状态。
int QDataStream::version() const
返回数据序列化格式的版本号。
QDataStream &QDataStream::writeBytes(const char *s, qint64 len)
将长度指示符 len 和缓冲区 s 写入流中,并返回流的一个引用。
len 作为 quint32 和可选的 quint64 进行序列化,接着是来自 s 的 len 字节。请注意,数据未进行编码。
qint64 QDataStream::writeRawData(const char *s, qint64 len)
将 s 中的 len 字节写入流中。返回实际写入的字节数,或出错时返回 -1。数据未进行编码。
另请参阅写入字节数、QIODevice::write 和 读取原始数据。
QDataStream &QDataStream::operator<<(qint8 i)
将有符号字节 i 写入流中,并返回流的引用。
QDataStream &QDataStream::operator<<(quint8 i)
这是一个重载函数。
将无符号字节 i 写入流中,并返回流的引用。
QDataStream &QDataStream::operator<<(qint16 i)
这是一个重载函数。
将有符号 16 位整数 i 写入流中,并返回流的引用。
QDataStream &QDataStream::operator<<(quint16 i)
这是一个重载函数。
将无符号 16 位整数 i 写入流中,并返回流的引用。
QDataStream &QDataStream::operator<<(qint32 i)
这是一个重载函数。
将有符号 32 位整数 i 写入流中,并返回流的引用。
QDataStream &QDataStream::operator<<(quint32 i)
这是一个重载函数。
将整数 i 写入流中作为 32 位无符号整数 (quint32),并返回流的引用。
QDataStream &QDataStream::operator<<(qint64 i)
这是一个重载函数。
将带符号的64位整数,i写入数据流,并返回数据流的引用。
QDataStream &QDataStream::operator<<(quint64 i)
这是一个重载函数。
将无符号的64位整数,i写入数据流,并返回数据流的引用。
QDataStream &QDataStream::operator<<(std::nullptr_t ptr)
这是一个重载函数。
模拟写入std::nullptr_t
,ptr到数据流中,并返回数据流的引用。此函数实际上不会向数据流写入任何内容,因为std::nullptr_t
值被存储为0个字节。
QDataStream &QDataStream::operator<<(bool )
将布尔值,i写入数据流。返回数据流的引用。
QDataStream &QDataStream::operator<<(float f)
这是一个重载函数。
使用标准的IEEE 754格式将浮点数,f写入数据流。返回数据流的引用。
另请参阅setFloatingPointPrecision。
QDataStream &QDataStream::operator<<(double f)
这是一个重载函数。
使用标准的IEEE 754格式将浮点数,f写入数据流。返回数据流的引用。
另请参阅setFloatingPointPrecision。
QDataStream &QDataStream::operator<<(const char *s)
这是一个重载函数。
将以'\0'结尾的字符串,s写入数据流并返回数据流的引用。
使用序列化字符串。
另请参阅writeBytes和writeRawData。
[自6.0起]
QDataStream &QDataStream::operator<<(char16_t c)
这是一个重载函数。
将字符,c写入数据流。返回数据流的引用。
此函数自Qt 6.0中引入。
[自6.0起]
QDataStream &QDataStream::operator<<(char32_t c)
这是一个重载函数。
将字符,c写入数据流。返回数据流的引用。
此函数自Qt 6.0中引入。
QDataStream &QDataStream::operator>>(qint8 &i)
从数据流读取带符号的字节到,i,并返回数据流的引用。
QDataStream &QDataStream::operator>>(quint8 &i)
这是一个重载函数。
从数据流读取无符号的字节到,i,并返回数据流的引用。
QDataStream &QDataStream::operator>>(qint16 &i)
这是一个重载函数。
从流中读取一个有符号16位整数到i中,并返回流的引用。
QDataStream &QDataStream::operator>>(quint16 &i)
这是一个重载函数。
从流中读取一个无符号16位整数到i中,并返回流的引用。
QDataStream &QDataStream::operator>>(qint32 &i)
这是一个重载函数。
从流中读取一个有符号32位整数到i中,并返回流的引用。
QDataStream &QDataStream::operator>>(quint32 &i)
这是一个重载函数。
从流中读取一个无符号32位整数到i中,并返回流的引用。
QDataStream &QDataStream::operator>>(qint64 &i)
这是一个重载函数。
从流中读取一个有符号64位整数到i中,并返回流的引用。
QDataStream &QDataStream::operator>>(quint64 &i)
这是一个重载函数。
从流中读取一个无符号64位整数到i中,并返回流的引用。
QDataStream &QDataStream::operator>>(std::nullptr_t &ptr)
这是一个重载函数。
模拟从流中读取一个std::nullptr_t
到ptr中并返回流的引用。此函数实际上并没有从流中读取任何内容,因为std::nullptr_t
值存储为0个字节。
QDataStream &QDataStream::operator>>(bool &i)
从流中读取一个布尔值到i。返回流的引用。
QDataStream &QDataStream::operator>>(float &f)
这是一个重载函数。
使用标准IEEE 754格式从流中读取一个浮点数到f中,并返回流的引用。
另请参阅setFloatingPointPrecision。
QDataStream &QDataStream::operator>>(double &f)
这是一个重载函数。
使用标准IEEE 754格式从流中读取一个浮点数到f中,并返回流的引用。
另请参阅setFloatingPointPrecision。
QDataStream &QDataStream::operator>>(char *&s)
这是一个重载函数。
从流中读取字符串s并返回流的引用。
使用readBytes()
进行反序列化,其序列化格式首先是一个quint32
长度的指定符,然后是这么多字节的数据。生成的字符串始终以'\0'终止。
使用new []
分配字符串空间 - 调用者必须用delete []
销毁它。
见也有readBytes()和readRawData().
[自6.0版本起]
QDataStream &QDataStream::operator>>(char16_t &c)
这是一个重载函数。
从流中读取一个16位宽的字符到c,并返回流的引用。
此函数自Qt 6.0中引入。
[自6.0版本起]
QDataStream &QDataStream::operator>>(char32_t &c)
这是一个重载函数。
从流中读取一个32位宽的字符到c,并返回流的引用。
此函数自Qt 6.0中引入。
相关非成员
[自6.0版本起]
模板 <typename T1, typename T2> QDataStream &operator<<(QDataStream &out, const std::pair<T1, T2> &pair)
将对pair写入输出流out。
此函数需要T1和T2类型实现operator<<()
操作符。
此函数自Qt 6.0中引入。
另请参阅序列化Qt数据类型。
[自6.0版本起]
模板 <typename T1, typename T2> QDataStream &operator>>(QDataStream &in, std::pair<T1, T2> &pair)
从输入流in中读取一个对pair。
此函数需要T1和T2类型实现operator>>()
操作符。
此函数自Qt 6.0中引入。
另请参阅序列化Qt数据类型。
© 2024 The Qt Company Ltd. 本文档中的贡献文档为各自所有人的版权。本提供的文档授权在自由软件基金会出版的GNU自由文档许可版本1.3的条款下。Qt和相应的标志是The Qt Company Ltd.在芬兰和/或其他国家的商标。所有其他商标均为其各自所有者的财产。