Sur cette page

QDataStream Class

La classe QDataStream permet la sérialisation de données binaires vers un fichier de type « QIODevice ». En savoir plus...

En-tête : #include <QDataStream>
CMake : find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake : QT += core
Hérite de : QIODeviceBase

Remarque : toutes les fonctions de cette classe sont réentrantes.

Types publics

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_12 }

Fonctions publiques

QDataStream()
QDataStream(QIODevice *d)
QDataStream(const QByteArray &a)
QDataStream(QByteArray *a, QIODeviceBase::OpenMode mode)
~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)
(since 6.10) operator bool() const
QDataStream &operator<<(qint8 i)
QDataStream &operator<<(bool i)
(since 6.0) QDataStream &operator<<(char16_t c)
(since 6.0) QDataStream &operator<<(char32_t c)
QDataStream &operator<<(const char *s)
QDataStream &operator<<(double f)
QDataStream &operator<<(float f)
QDataStream &operator<<(qint16 i)
QDataStream &operator<<(qint32 i)
QDataStream &operator<<(qint64 i)
QDataStream &operator<<(quint16 i)
QDataStream &operator<<(quint32 i)
QDataStream &operator<<(quint64 i)
QDataStream &operator<<(quint8 i)
QDataStream &operator<<(std::nullptr_t ptr)
QDataStream &operator>>(bool &i)
QDataStream &operator>>(qint8 &i)
QDataStream &operator>>(char *&s)
(since 6.0) QDataStream &operator>>(char16_t &c)
(since 6.0) QDataStream &operator>>(char32_t &c)
QDataStream &operator>>(double &f)
QDataStream &operator>>(float &f)
QDataStream &operator>>(qint16 &i)
QDataStream &operator>>(qint32 &i)
QDataStream &operator>>(qint64 &i)
QDataStream &operator>>(quint16 &i)
QDataStream &operator>>(quint32 &i)
QDataStream &operator>>(quint64 &i)
QDataStream &operator>>(quint8 &i)
QDataStream &operator>>(std::nullptr_t &ptr)
(since 6.0) QDataStream &operator<<(QDataStream &out, const std::pair<T1, T2> &pair)
QDataStream &operator<<(QDataStream &ds, qfloat16 f)
QDataStream &operator>>(QDataStream &ds, qfloat16 &f)
(since 6.0) QDataStream &operator>>(QDataStream &in, std::pair<T1, T2> &pair)

Description détaillée

Un flux de données est un flux binaire d'informations codées qui est 100 % indépendant du système d'exploitation, du processeur ou de l'ordre des octets de l'ordinateur hôte. Par exemple, un flux de données écrit par un PC sous Windows peut être lu par un Sun SPARC fonctionnant sous Solaris.

Vous pouvez également utiliser un flux de données pour lire/écrire des fichiers au format « raw unencoded binary data ». Si vous souhaitez un flux d'entrée « d'analyse », consultez QTextStream.

La classe QDataStream implémente la sérialisation des types de données de base du C++, tels que char, short, int, char *, etc. La sérialisation de données plus complexes s'effectue en décomposant les données en unités primitives.

Un flux de données est étroitement lié à un QIODevice. Un QIODevice représente un support d’entrée/sortie sur lequel on peut lire et écrire des données. La classe QFile est un exemple de périphérique d’E/S.

Exemple (écriture de données binaires dans un flux) :

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

Exemple (lecture de données binaires à partir d'un flux) :

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

Chaque élément écrit dans le flux est enregistré dans un format binaire prédéfini qui varie en fonction du type de l'élément. Les types Qt pris en charge incluent QBrush, QColor, QDateTime, QFont, QPixmap, QString, QVariant et bien d’autres encore. Pour obtenir la liste complète de tous les types Qt prenant en charge la transmission de données en continu, consultez la section « Sérialisation des types de données Qt ».

Pour les entiers, il est préférable de toujours effectuer un transtypage vers un type entier Qt lors de l'écriture, et de les relire dans le même type entier Qt. Cela garantit que vous obtenez des entiers de la taille souhaitée et vous protège des différences entre compilateurs et plateformes.

Les énumérations peuvent être sérialisées via QDataStream sans qu’il soit nécessaire de définir manuellement des opérateurs de flux. Les classes d’énumération sont sérialisées en utilisant la taille déclarée.

Le périphérique d'E/S initial est généralement défini dans le constructeur, mais peut être modifié à l'aide de ` setDevice()`. Si vous avez atteint la fin des données (ou si aucun périphérique d'E/S n'est défini), ` atEnd()` renverra `true`.

Sérialisation des conteneurs et des chaînes de caractères

Le format de sérialisation se compose d’abord d’un spécificateur de longueur, suivi de l octets de données. Le spécificateur de longueur est un quint32 si la version est inférieure à 6.7 ou si le nombre d’éléments est inférieur à 0xfffffffe (2^32 - 2). Sinon, il y a une valeur d’extension 0xfffffffe suivie d’un quint64 contenant la valeur réelle. De plus, pour les conteneurs prenant en charge isNull(), celui-ci est encodé sous la forme d’un seul quint32 dont tous les bits sont activés et ne contenant aucune donnée.

Pour prendre un exemple, si la taille de la chaîne tient dans 32 bits, une chaîne de type « char * » est écrite sous la forme d’un entier de 32 bits égal à la longueur de la chaîne, y compris l’octet «\0 », suivi de tous les caractères de la chaîne, y compris l’octet «\0 ». Si la taille de la chaîne est supérieure, la valeur 0xffffffffe est écrite en tant que marqueur de taille étendue, suivie de 64 bits correspondant à la taille réelle. Lors de la lecture d’une chaîne « char * », 4 octets sont d’abord lus. Si la valeur n’est pas égale à 0xffffffffe (le marqueur de taille étendue), ces 4 octets sont alors considérés comme la taille de 32 bits de la chaîne. Dans le cas contraire, les 8 octets suivants sont lus et considérés comme la taille de 64 bits de la chaîne. Ensuite, tous les caractères de la chaîne « char * », y compris le caractère de fin «\0 », sont lus.

Gestion des versions

Le format binaire de QDataStream a évolué depuis Qt 1.0 et devrait continuer à évoluer pour refléter les modifications apportées à Qt. Lors de l’entrée ou de la sortie de types complexes, il est très important de s’assurer que la même version du flux (version()) est utilisée pour la lecture et l’écriture. Si vous avez besoin à la fois d’une compatibilité ascendante et descendante, vous pouvez coder en dur le numéro de version dans l’application :

stream.setVersion(QDataStream::Qt_4_0);

Si vous créez un nouveau format de données binaires, tel qu’un format de fichier pour les documents générés par votre application, vous pouvez utiliser un QDataStream pour écrire les données dans un format portable. En général, vous écrirez un bref en-tête contenant une chaîne magique et un numéro de version afin de vous laisser une marge de manœuvre pour de futures extensions. Par exemple :

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;

Ensuite, lisez-le à l'aide de :

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_1);
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;

Vous pouvez choisir l'ordre des octets à utiliser lors de la sérialisation des données. Le paramètre par défaut est « big-endian » (MSB d'abord). Le passer en « little-endian » compromet la portabilité (à moins que le lecteur ne passe également en « little-endian »). Nous vous recommandons de conserver ce paramètre, sauf si vous avez des exigences particulières.

Lecture et écriture de données binaires brutes

Vous pouvez souhaiter lire ou écrire directement vos propres données binaires brutes depuis ou vers le flux de données. Les données peuvent être lues à partir du flux et stockées dans une zone de mémoire préallouée char * à l’aide de la fonction readRawData(). De même, les données peuvent être écrites dans le flux à l’aide de la fonction writeRawData(). Notez que tout encodage ou décodage des données doit être effectué par vos soins.

char *Il existe une paire de fonctions similaires : readBytes() et writeBytes(). Celles-ci diffèrent de leurs équivalents « bruts » comme suit : readBytes() lit un quint32 considéré comme la longueur des données à lire, puis ce nombre d’octets est lu dans l’ préalloué ; writeBytes() écrit un quint32 contenant la longueur des données, suivi des données. Notez que tout encodage/décodage des données (à l'exception de la longueur en quint32) doit être effectué par vos soins.

Lecture et écriture des classes de collection Qt

Les classes de conteneurs Qt peuvent également être sérialisées vers un QDataStream. Il s’agit notamment de QList, QSet, QHash et QMap. Les opérateurs de flux sont déclarés en tant que non-membres des classes.

Lecture et écriture d’autres classes Qt

Outre les opérateurs de flux surchargés documentés ici, toutes les classes Qt que vous souhaiteriez sérialiser vers un QDataStream disposeront d’opérateurs de flux appropriés déclarés comme non-membres de la classe :

QDataStream &operator<<(QDataStream &, const QXxx &);
QDataStream &operator>>(QDataStream &, QXxx &);

Par exemple, voici les opérateurs de flux déclarés comme non-membres de la classe ` QImage ` :

QDataStream &operator<<(QDataStream &stream, const QImage &image);
QDataStream &operator>>(QDataStream &stream, QImage &image);

Pour savoir si votre classe Qt préférée dispose d'opérateurs de flux similaires, consultez la section « Éléments non membres associés » de la page de documentation de la classe.

Utilisation des transactions de lecture

Lorsqu’un flux de données opère sur un périphérique asynchrone, les blocs de données peuvent arriver à des moments aléatoires. La classe QDataStream implémente un mécanisme de transaction qui permet de lire les données de manière atomique à l'aide d'une série d'opérateurs de flux. À titre d'exemple, vous pouvez gérer les lectures incomplètes provenant d'un socket en utilisant une transaction dans un slot connecté au signal readyRead() :

in.startTransaction();
QString str;
qint32 a;
in >> str >> a; // try to read packet atomically

if (!in.commitTransaction())
    return;     // wait for more data

Si aucun paquet complet n'est reçu, ce code ramène le flux à sa position initiale, après quoi il faut attendre l'arrivée de nouvelles données.

Corruption et sécurité

QDataStream n’est pas résilient face à des entrées de données corrompues et ne doit donc pas être utilisé dans des contextes sensibles en matière de sécurité, même en cas d’utilisation de transactions. Les transactions permettent de déterminer si une entrée valide peut être décodée à partir des données actuellement disponibles sur un périphérique asynchrone, mais partent du principe que les données disponibles sont correctement formées.

De plus, de nombreux opérateurs de démarshalling de QDataStream allouent de la mémoire en fonction des informations contenues dans le flux. Ces opérateurs ne vérifient pas si la quantité de mémoire demandée est raisonnable ni si elle est compatible avec la quantité de données disponibles dans le flux (par exemple : le démarshalling d’un QByteArray ou d’un QString peut entraîner une demande d’allocation de plusieurs gigaoctets de données).

QDataStream ne doit pas être utilisé sur du contenu dont la provenance n’est pas fiable. Les applications doivent être conçues pour ne tenter de décoder que les flux dont la provenance est au moins aussi fiable que celle de l’application elle-même ou de ses plugins.

Voir également QTextStream et QVariant.

Documentation sur les types de membres

enum QDataStream::ByteOrder

L'ordre des octets utilisé pour la lecture et l'écriture des données.

ConstanteValeurDescription
QDataStream::BigEndianQSysInfo::BigEndianOctet le plus significatif en premier (par défaut)
QDataStream::LittleEndianQSysInfo::LittleEndianOctet de poids le moins significatif en premier

enum QDataStream::FloatingPointPrecision

La précision des nombres à virgule flottante utilisés pour la lecture et l'écriture des données. Ce paramètre n'aura d'effet que si la version du flux de données est Qt_4_6 ou supérieure.

Avertissement : la précision en virgule flottante doit être définie sur la même valeur pour l’objet qui écrit et celui qui lit le flux de données.

ConstanteValeurDescription
QDataStream::SinglePrecision0Tous les nombres à virgule flottante du flux de données ont une précision de 32 bits.
QDataStream::DoublePrecision1Tous les nombres à virgule flottante du flux de données ont une précision de 64 bits.

Voir également setFloatingPointPrecision() et floatingPointPrecision().

enum QDataStream::Status

Cette énumération décrit l'état actuel du flux de données.

ConstanteValeurDescription
QDataStream::Ok0Le flux de données fonctionne normalement.
QDataStream::ReadPastEnd1Le flux de données a lu au-delà de la fin des données présentes dans le périphérique sous-jacent.
QDataStream::ReadCorruptData2Le flux de données a lu des données corrompues.
QDataStream::WriteFailed3Le flux de données ne peut pas écrire sur le périphérique sous-jacent.
QDataStream::SizeLimitExceeded (since Qt 6.7)4Le flux de données ne peut ni lire ni écrire les données car leur taille dépasse celle prise en charge par la plate-forme actuelle. Cela peut se produire, par exemple, lorsque l'on tente de lire plus de 2 Gio de données sur une plate-forme 32 bits.

enum QDataStream::Version

Cette énumération fournit des synonymes symboliques pour les numéros de version du format de sérialisation des données.

ConstanteValeur
QDataStream::Qt_1_01
QDataStream::Qt_2_02
QDataStream::Qt_2_13
QDataStream::Qt_3_04
QDataStream::Qt_3_15
QDataStream::Qt_3_36
QDataStream::Qt_4_07
QDataStream::Qt_4_1Qt_4_0
QDataStream::Qt_4_28
QDataStream::Qt_4_39
QDataStream::Qt_4_410
QDataStream::Qt_4_511
QDataStream::Qt_4_612
QDataStream::Qt_4_7Qt_4_6
QDataStream::Qt_4_8Qt_4_7
QDataStream::Qt_4_9Qt_4_8
QDataStream::Qt_5_013
QDataStream::Qt_5_114
QDataStream::Qt_5_215
QDataStream::Qt_5_3Qt_5_2
QDataStream::Qt_5_416
QDataStream::Qt_5_5Qt_5_4
QDataStream::Qt_5_617
QDataStream::Qt_5_7Qt_5_6
QDataStream::Qt_5_8Qt_5_7
QDataStream::Qt_5_9Qt_5_8
QDataStream::Qt_5_10Qt_5_9
QDataStream::Qt_5_11Qt_5_10
QDataStream::Qt_5_1218
QDataStream::Qt_5_1319
QDataStream::Qt_5_14Qt_5_13
QDataStream::Qt_5_15Qt_5_14
QDataStream::Qt_6_020
QDataStream::Qt_6_1Qt_6_0
QDataStream::Qt_6_2Qt_6_0
QDataStream::Qt_6_3Qt_6_0
QDataStream::Qt_6_4Qt_6_0
QDataStream::Qt_6_5Qt_6_0
QDataStream::Qt_6_621
QDataStream::Qt_6_722
QDataStream::Qt_6_8Qt_6_7
QDataStream::Qt_6_9Qt_6_7
QDataStream::Qt_6_1023
QDataStream::Qt_6_1124
QDataStream::Qt_6_12Qt_6_11

Voir également setVersion() et version().

Documentation des fonctions membres

QDataStream::QDataStream()

Crée un flux de données ne comportant aucun périphérique d'E/S.

Voir également setDevice().

[explicit] QDataStream::QDataStream(QIODevice *d)

Crée un flux de données utilisant le périphérique d'E/S d.

Voir également setDevice() et device().

QDataStream::QDataStream(const QByteArray &a)

Crée un flux de données en lecture seule qui opère sur un tableau d'octets a. Utilisez QDataStream(QByteArray*, int) si vous souhaitez écrire dans un tableau d'octets.

QByteArray n'étant pas une sous-classe de QIODevice, un objet QBuffer est créé en interne pour encapsuler le tableau d'octets.

QDataStream::QDataStream(QByteArray *a, QIODeviceBase::OpenMode mode)

Crée un flux de données qui opère sur un tableau d'octets, a. L'mode décrit comment utiliser ce périphérique.

Vous pouvez également utiliser `QDataStream(const QByteArray &)` si vous souhaitez simplement lire à partir d'un tableau d'octets.

QByteArray n'étant pas une sous-classe de QIODevice, un objet QBuffer est créé en interne pour encapsuler le tableau d'octets.

[noexcept] QDataStream::~QDataStream()

Détruit le flux de données.

Le destructeur n'affectera pas le périphérique d'E/S actuel, sauf s'il s'agit d'un périphérique d'E/S interne (par exemple, un QBuffer) traitant une QByteArray transmise au constructeur, auquel cas le périphérique d'E/S interne est détruit.

void QDataStream::abortTransaction()

Annule une transaction de lecture.

Cette fonction est couramment utilisée pour annuler la transaction après des erreurs de protocole de niveau supérieur ou une perte de synchronisation du flux.

Si elle est appelée sur une transaction interne, l'annulation est déléguée à la transaction la plus externe, et les transactions internes lancées par la suite sont forcées d'échouer.

Pour la transaction la plus externe, supprime le point de restauration et toutes les données du flux dupliquées en interne. N’affecte pas la position de lecture actuelle du flux.

Définit l’état du flux de données sur

ConstantDescription
ReadCorruptData.

Voir également startTransaction(), commitTransaction() et rollbackTransaction().

bool QDataStream::atEnd() const

Renvoie ` true ` si le périphérique d'E/S a atteint la fin (fin du flux ou du fichier) ou si aucun périphérique d'E/S n'est défini ; sinon, renvoie ` false`.

Voir également QIODevice::atEnd().

QDataStream::ByteOrder QDataStream::byteOrder() const

Renvoie le paramètre d'ordre des octets actuel : soit « BigEndian », soit « LittleEndian ».

Voir également setByteOrder().

bool QDataStream::commitTransaction()

Termine une transaction de lecture. Renvoie ` true ` si aucune erreur de lecture ne s'est produite au cours de la transaction ; sinon, renvoie ` false`.

Si elle est appelée au sein d’une transaction interne, la validation sera reportée jusqu’à ce que l’appel le plus externe à `commitTransaction()`, ` rollbackTransaction()` ou ` abortTransaction()` ait lieu.

Sinon, si l’état du flux indique que la lecture a dépassé la fin des données, cette fonction rétablit les données du flux jusqu’au point de l’appel à startTransaction(). Lorsque cette situation se produit, vous devez attendre l’arrivée de nouvelles données, après quoi vous lancez une nouvelle transaction. Si le flux de données a lu des données corrompues ou si l’une des transactions internes a été interrompue, cette fonction interrompt la transaction.

Voir également startTransaction(), rollbackTransaction() et abortTransaction().

QIODevice *QDataStream::device() const

Renvoie le périphérique d'E/S actuellement défini, ou nullptr si aucun périphérique n'est défini.

Voir aussi setDevice().

QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision() const

Renvoie la précision en virgule flottante du flux de données.

Voir également FloatingPointPrecision et setFloatingPointPrecision().

[since 6.7] QDataStream &QDataStream::readBytes(char *&s, qint64 &l)

Lit le tampon s à partir du flux et renvoie une référence au flux.

Le tampon s est alloué à l'aide de new []. Détruisez-le à l'aide de l'opérateur delete [].

Le paramètre ` l ` est défini sur la longueur du tampon. Si la chaîne lue est vide, ` l ` est défini sur 0 et ` s ` est défini sur ` nullptr`.

Le format de sérialisation se compose d’abord d’un spécificateur de longueur, suivi de l octets de données. Le spécificateur de longueur est un quint32 si la version est inférieure à 6.7 ou si le nombre d’éléments est inférieur à 0xfffffffe (2^32 - 2) ; dans le cas contraire, il s’agit d’une valeur d’extension 0xfffffffe suivie d’un quint64 contenant la valeur réelle. De plus, pour les conteneurs prenant en charge isNull(), celui-ci est encodé sous la forme d’un seul quint32 dont tous les bits sont activés et ne contenant aucune donnée.

Cette fonction a été introduite dans Qt 6.7.

Voir également readRawData() et writeBytes().

qint64 QDataStream::readRawData(char *s, qint64 len)

Lit au maximum len octets depuis le flux dans s et renvoie le nombre d'octets lus. En cas d'erreur, cette fonction renvoie -1.

Le tampon s doit être préalloué. Les données ne sont pas décodées.

Voir également readBytes(), QIODevice::read() et writeRawData().

void QDataStream::resetStatus()

Réinitialise l'état du flux de données.

Voir également Status, status() et setStatus().

void QDataStream::rollbackTransaction()

Annule une transaction de lecture.

Cette fonction est couramment utilisée pour annuler la transaction lorsqu'une lecture incomplète a été détectée avant la validation de la transaction.

Si elle est appelée sur une transaction interne, l'annulation est déléguée à la transaction la plus externe, et les transactions internes lancées par la suite sont forcées d'échouer.

Pour la transaction la plus externe, restaure les données du flux jusqu’au point de l’appel à ` startTransaction()`. Si le flux de données a lu des données corrompues ou si l’une des transactions internes a été interrompue, cette fonction interrompt la transaction.

Si les opérations de flux précédentes ont abouti, définit l’état du flux de données sur

ConstantDescription
ReadPastEnd.

Voir également startTransaction(), commitTransaction() et abortTransaction().

void QDataStream::setByteOrder(QDataStream::ByteOrder bo)

Définit l'ordre des octets de sérialisation sur « bo ».

Le paramètre « bo » peut prendre les valeurs suivantes : « QDataStream::BigEndian » ou « QDataStream::LittleEndian ».

La valeur par défaut est « big-endian ». Nous vous recommandons de conserver ce paramètre, sauf si vous avez des besoins particuliers.

Voir également byteOrder().

void QDataStream::setDevice(QIODevice *d)

void QDataStream::setDevice(QIODevice * d)

Définit le périphérique d'E/S sur ` d`, qui peut être ` nullptr ` pour désactiver le périphérique d'E/S actuel.

Voir aussi device().

void QDataStream::setFloatingPointPrecision(QDataStream::FloatingPointPrecision precision)

Définit la précision en virgule flottante du flux de données sur precision. Si la précision en virgule flottante est DoublePrecision et que la version du flux de données est Qt_4_6 ou supérieure, tous les nombres à virgule flottante seront écrits et lus avec une précision de 64 bits. Si la précision en virgule flottante est SinglePrecision et que la version est Qt_4_6 ou supérieure, tous les nombres à virgule flottante seront écrits et lus avec une précision de 32 bits.

Pour les versions antérieures à Qt_4_6, la précision des nombres à virgule flottante dans le flux de données dépend de l’opérateur de flux appelé.

La valeur par défaut est DoublePrecision.

Notez que cette propriété n’affecte pas la sérialisation ou la désérialisation des instances de ` qfloat16 `.

Avertissement : cette propriété doit être définie sur la même valeur sur l’objet qui écrit et sur l’objet qui lit le flux de données.

Voir aussi ` floatingPointPrecision()`.

void QDataStream::setStatus(QDataStream::Status status)

Définit l'état du flux de données sur l'status e spécifiée.

Les appels suivants à setStatus() sont ignorés jusqu’à ce que la fonction resetStatus() soit appelée.

Voir également Status, status() et resetStatus().

void QDataStream::setVersion(int v)

Définit le numéro de version du format de sérialisation des données sur « v », une valeur de l'énumération « Version ».

Vous n'avez pas besoin de définir de version si vous utilisez la version actuelle de Qt, mais nous vous recommandons de le faire pour vos propres formats binaires personnalisés ; voir Versioning dans la section « Description détaillée ».

Afin de prendre en charge de nouvelles fonctionnalités, le format de sérialisation en flux de données de certaines classes Qt a été modifié dans certaines versions de Qt. Si vous souhaitez lire des données créées par une version antérieure de Qt, ou écrire des données pouvant être lues par un programme compilé avec une version antérieure de Qt, utilisez cette fonction pour modifier le format de sérialisation utilisé par ` QDataStream`.

L'énumération ` Version ` fournit des constantes symboliques pour les différentes versions de Qt. Par exemple :

QDataStream out(&file);
out.setVersion(QDataStream::Qt_4_0);

Voir également ` version()` et ` Version`.

qint64 QDataStream::skipRawData(qint64 len)

Ignore len octets du périphérique. Renvoie le nombre d’octets effectivement ignorés, ou -1 en cas d’erreur.

Cela revient à appeler la fonction ` readRawData()` sur un tampon de longueur ` len ` et à ignorer le contenu de ce tampon.

Voir aussi QIODevice::seek().

void QDataStream::startTransaction()

Lance une nouvelle transaction de lecture sur le flux.

Définit un point de restauration au sein de la séquence d’opérations de lecture. Pour les périphériques séquentiels, les données lues seront dupliquées en interne afin de permettre la récupération en cas de lectures incomplètes. Pour les périphériques à accès aléatoire, cette fonction enregistre la position actuelle du flux. Appelez commitTransaction(), rollbackTransaction() ou abortTransaction() pour terminer la transaction en cours.

Une fois qu’une transaction est lancée, les appels suivants à cette fonction rendront la transaction récursive. Les transactions internes agissent en tant qu’agents de la transaction la plus externe (c’est-à-dire qu’elles signalent l’état des opérations de lecture à la transaction la plus externe, qui peut alors restaurer la position du flux).

Remarque : la restauration jusqu’au point de l’appel imbriqué à `startTransaction()` n’est pas prise en charge.

Lorsqu’une erreur survient au cours d’une transaction (y compris l’échec d’une transaction imbriquée), la lecture à partir du flux de données est suspendue (toutes les opérations de lecture suivantes renvoient des valeurs vides ou nulles) et les transactions imbriquées suivantes sont forcées à échouer. Le lancement d’une nouvelle transaction la plus externe permet de sortir de cet état. Ce comportement rend inutile la vérification séparée de chaque opération de lecture.

Voir également commitTransaction(), rollbackTransaction() et abortTransaction().

QDataStream::Status QDataStream::status() const

Renvoie l'état du flux de données.

Voir également Status, setStatus() et resetStatus().

int QDataStream::version() const

Renvoie le numéro de version du format de sérialisation des données.

Voir également setVersion() et Version.

QDataStream &QDataStream::writeBytes(const char *s, qint64 len)

Écrit le spécificateur de longueur len et le tampon s dans le flux, puis renvoie une référence à ce dernier.

La valeur len est sérialisée sous la forme d’un quint32 et, éventuellement, d’un quint64, suivis de len octets provenant de s. Notez que les données ne sont pas encodées.

Voir également writeRawData() et readBytes().

qint64 QDataStream::writeRawData(const char *s, qint64 len)

Écrit len octets depuis s dans le flux. Renvoie le nombre d'octets effectivement écrits, ou -1 en cas d'erreur. Les données ne sont pas encodées.

Voir également writeBytes(), QIODevice::write() et readRawData().

[explicit noexcept, since 6.10] QDataStream::operator bool() const

Indique si ce flux ne présente aucune erreur (la fonction `status()` renvoie ` Ok`).

Cette fonction a été introduite dans Qt 6.10.

QDataStream &QDataStream::operator<<(qint8 i)

Écrit un octet signé, i, dans le flux et renvoie une référence au flux.

QDataStream &QDataStream::operator<<(bool i)

Écrit une valeur booléenne, i, dans le flux. Renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

[since 6.0] QDataStream &QDataStream::operator<<(char16_t c)

Écrit un caractère, c, dans le flux. Renvoie une référence au flux

Il s'agit d'une fonction surchargée.

Cette fonction a été introduite dans Qt 6.0.

[since 6.0] QDataStream &QDataStream::operator<<(char32_t c)

Écrit un caractère, c, dans le flux. Renvoie une référence au flux

Il s'agit d'une fonction surchargée.

Cette fonction a été introduite dans Qt 6.0.

QDataStream &QDataStream::operator<<(const char *s)

Écrit la chaîne « s », terminée par «\0 », dans le flux et renvoie une référence à ce dernier.

La chaîne est sérialisée à l'aide de ` writeBytes()`.

Il s'agit d'une fonction surchargée.

Voir également writeBytes() et writeRawData().

QDataStream &QDataStream::operator<<(double f)

Écrit un nombre à virgule flottante, f, dans le flux en utilisant le format standard IEEE 754. Renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

Voir aussi setFloatingPointPrecision().

QDataStream &QDataStream::operator<<(float f)

Écrit un nombre à virgule flottante, f, dans le flux en utilisant le format standard IEEE 754. Renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

Voir également setFloatingPointPrecision().

QDataStream &QDataStream::operator<<(qint16 i)

Écrit un entier signé de 16 bits, i, dans le flux et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

QDataStream &QDataStream::operator<<(qint32 i)

Écrit un entier signé de 32 bits, i, dans le flux et renvoie une référence à ce flux.

Il s'agit d'une fonction surchargée.

QDataStream &QDataStream::operator<<(qint64 i)

Écrit un entier signé de 64 bits, i, dans le flux et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

QDataStream &QDataStream::operator<<(quint16 i)

Écrit un entier non signé de 16 bits, i, dans le flux et renvoie une référence à ce flux.

Il s’agit d’une fonction surchargée.

QDataStream &QDataStream::operator<<(quint32 i)

Écrit un entier non signé, i, dans le flux sous la forme d'un entier non signé de 32 bits (quint32). Renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

QDataStream &QDataStream::operator<<(quint64 i)

Écrit un entier non signé de 64 bits, i, dans le flux et renvoie une référence à ce dernier.

Il s'agit d'une fonction surchargée.

QDataStream &QDataStream::operator<<(quint8 i)

Écrit un octet non signé, i, dans le flux et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

QDataStream &QDataStream::operator<<(std::nullptr_t ptr)

Simule l'écriture d'une chaîne de caractères std::nullptr_t, ptr, dans le flux et renvoie une référence à ce dernier. Cette fonction n'écrit en réalité rien dans le flux, car les valeurs de type std::nullptr_t sont stockées sous forme de 0 octet.

Il s'agit d'une fonction surchargée.

QDataStream &QDataStream::operator>>(bool &i)

Lit une valeur booléenne à partir du flux et la stocke dans ` i`. Renvoie une référence au flux.

QDataStream &QDataStream::operator>>(qint8 &i)

Lit un octet signé à partir du flux et le stocke dans ` i`, puis renvoie une référence au flux.

QDataStream &QDataStream::operator>>(char *&s)

Lit la chaîne « s » à partir du flux et renvoie une référence à ce flux.

La chaîne est désérialisée à l’aide de ` readBytes() `, où le format de sérialisation est constitué d’abord d’un spécificateur de longueur ` quint32 `, suivi d’autant d’octets de données. La chaîne résultante est toujours terminée par «\0 ».

L’espace nécessaire à la chaîne est alloué à l’aide de ` new [] ` ; l’appelant doit le détruire à l’aide de ` delete []`.

Il s’agit d’une fonction surchargée.

Voir également readBytes() et readRawData().

[since 6.0] QDataStream &QDataStream::operator>>(char16_t &c)

Lit un caractère de 16 bits provenant du flux et le stocke dans ` c `, puis renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

Cette fonction a été introduite dans Qt 6.0.

[since 6.0] QDataStream &QDataStream::operator>>(char32_t &c)

Lit un caractère de 32 bits provenant du flux et le stocke dans l c, puis renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

Cette fonction a été introduite dans Qt 6.0.

QDataStream &QDataStream::operator>>(double &f)

Lit un nombre à virgule flottante à partir du flux et le stocke dans ` f`, en utilisant le format standard IEEE 754. Renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

Voir également ` setFloatingPointPrecision()`.

QDataStream &QDataStream::operator>>(float &f)

Lit un nombre à virgule flottante depuis le flux et le stocke dans ` f`, en utilisant le format standard IEEE 754. Renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

Voir également ` setFloatingPointPrecision()`.

QDataStream &QDataStream::operator>>(qint16 &i)

Lit un entier signé de 16 bits à partir du flux et l'affecte à ` i`, puis renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

QDataStream &QDataStream::operator>>(qint32 &i)

Lit un entier signé de 32 bits à partir du flux et l'affecte à ` i`, puis renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

QDataStream &QDataStream::operator>>(qint64 &i)

Lit un entier signé de 64 bits à partir du flux et l'affecte à ` i`, puis renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

QDataStream &QDataStream::operator>>(quint16 &i)

Lit un entier non signé de 16 bits depuis le flux dans ` i` et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

QDataStream &QDataStream::operator>>(quint32 &i)

Lit un entier non signé de 32 bits à partir du flux et le stocke dans ` i`, puis renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

QDataStream &QDataStream::operator>>(quint64 &i)

Lit un entier non signé de 64 bits à partir du flux, dans ` i`, et renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

QDataStream &QDataStream::operator>>(quint8 &i)

Lit un octet non signé depuis le flux et le stocke dans ` i`, puis renvoie une référence au flux.

Il s'agit d'une fonction surchargée.

QDataStream &QDataStream::operator>>(std::nullptr_t &ptr)

Simule la lecture d'un std::nullptr_t s à partir du flux dans ` ptr ` et renvoie une référence au flux. Cette fonction ne lit en réalité rien à partir du flux, car les valeurs de ` std::nullptr_t ` sont stockées sous forme de 0 octet.

Il s'agit d'une fonction surchargée.

Éléments non membres associés

[since 6.0] template <typename T1, typename T2> QDataStream &operator<<(QDataStream &out, const std::pair<T1, T2> &pair)

Écrit la paire pair dans le flux out.

Cette fonction nécessite que les types T1 et T2 implémentent operator<<().

Cette fonction a été introduite dans Qt 6.0.

Voir également Sérialisation des types de données Qt.

QDataStream &operator<<(QDataStream &ds, qfloat16 f)

Écrit un nombre à virgule flottante, f, dans le flux ds en utilisant le format standard IEEE 754. Renvoie une référence au flux.

Remarque : dans les versions de Qt antérieures à la version 6.3, il s’agissait d’une fonction membre de QDataStream.

QDataStream &operator>>(QDataStream &ds, qfloat16 &f)

Lit un nombre à virgule flottante à partir du flux ds et le stocke dans f, en utilisant le format standard IEEE 754. Renvoie une référence au flux.

Remarque : dans les versions de Qt antérieures à la version 6.3, il s’agissait d’une fonction membre de ` QDataStream`.

[since 6.0] template <typename T1, typename T2> QDataStream &operator>>(QDataStream &in, std::pair<T1, T2> &pair)

Lit une paire depuis le flux in et l'enregistre dans pair.

Cette fonction nécessite que les types T1 et T2 implémentent l'interface operator>>().

Cette fonction a été introduite dans Qt 6.0.

Voir également Sérialisation des types de données Qt.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.