QDataStream ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ Π‘++ ΠΈ Qt; ΠΏΠΎΠ»Π½ΡΠΉ ΠΈΡ ΡΠΏΠΈΡΠΎΠΊ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² ΡΠ΅ΡΠΈ ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http://doc.trolltech.com/4.1/datastreamformat.html. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΠ²ΠΎΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ ΡΠΈΠΏΠΎΠ², ΠΏΠ΅ΡΠ΅Π³ΡΡΠΆΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ << ΠΈ >>. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΎ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ QDataStream:
01 class Painting
02 {
03 public:
04 Painting() { myYear = 0; }
05 Painting(const QString &title, const QString &artist, int year) {
06 myTitle = title;
07 myArtist = artist;
08 myYear = year;
09 }
10 void setTitle(const QString &title) { myTitle = title; }
11 QString title() const { return myTitle; }
12 β¦
13 private:
14 QString myTitle;
15 QString myArtist;
16 int myYear;
17 };
18 QDataStream &operator << (QDataStream &out, const Painting &painting);
19 QDataStream &operator >> (QDataStream &in, Painting &painting);
ΠΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° <<:
01 QDataStream &operator << (QDataStream &out, const Painting &painting)
02 {
03 out << painting.title() << painting.artist()
04 << quint32(painting.year());
05 return out;
06 }
ΠΠ»Ρ Π²ΡΠ²ΠΎΠ΄Π° Painting ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ Π΄Π²Π΅ ΡΡΡΠΎΠΊΠΈ ΡΠΈΠΏΠ° QString ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° quint32. Π ΠΊΠΎΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΏΠΎΡΠΎΠΊ. ΠΡΠΎΡ ΠΎΠ±ΡΡΠ½ΡΠΉ Π² Π‘++ ΠΏΡΠΈΠ΅ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² << Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° Π΄Π°Π½Π½ΡΡ Π² ΠΏΠΎΡΠΎΠΊ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
out << painting1 << painting2 << painting3;
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° >> Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° <<.
01 QDataStream &operator >> (QDataStream &in, Painting &painting)
02 {
03 QString title;
04 QString artist;
05 quint32 year;
06 in >> title >> artist >> year;
07 painting = Painting(title, artist, year);
08 return in;
09 }
ΠΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ ΡΠΈΠΏΠ°Ρ Π΄Π°Π½Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Π²Π²ΠΎΠ΄Π°βΠ²ΡΠ²ΠΎΠ΄Π° Π² ΠΏΠΎΡΠΎΠΊ Π΄Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ². ΠΠ΄Π½ΠΎ ΠΈΠ· Π½ΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ Π² ΠΏΠΎΡΠΎΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
QList<Painting> paintings = β¦;
out << paintings;
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΡΠΎΡΡΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ:
QList<Painting> paintings;
in >> paintings;
ΠΡΠΎ ΠΏΡΠΈΠ²Π΅Π»ΠΎ Π±Ρ ΠΊ ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, Π΅ΡΠ»ΠΈ Π±Ρ ΡΠΈΠΏ Painting Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π» ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ << ΠΈΠ»ΠΈ >>. ΠΡΠ΅ ΠΎΠ΄Π½ΠΎ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Π² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ ΡΠΈΠΏΠ°Ρ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΡΠΈΡ ΡΠΈΠΏΠΎΠ² Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² QVariant, ΡΡΠΎ ΡΠ°ΡΡΠΈΡΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ QSettings. ΠΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΈ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΡΠΈΠΏΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ qRegisterMetaTypeStreamOperators<T>(), ΡΠ°Π±ΠΎΡΠ° ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ Π² Π³Π»Π°Π²Π΅ 11.
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ QDataStream Qt ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ². ΠΡΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ Π½Π°Ρ ΠΎΡ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΡ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ, ΠΈ ΠΎΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Π±Ρ ΡΠΎ Π½ΠΈ Π±ΡΠ»ΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΡ ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π»ΠΈΡΡ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΡΠΈΠΏΠΎΠ² Π² ΡΠΎΠΉ ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ°Π½Ρ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡ Qt ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π²ΡΠ΅Ρ Π΄Π΅ΡΠ°Π»Π΅ΠΉ.
QDataStream ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ Π΄Π»Ρ ΡΠ²ΠΎΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ ΡΠΎΡΠΌΠ°ΡΠΎΠ² ΡΠ°ΠΉΠ»ΠΎΠ², ΡΠ°ΠΊ ΠΈ Π΄Π»Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π΄Π²ΠΎΠΈΡΠ½ΡΡ ΡΠΎΡΠΌΠ°ΡΠΎΠ². ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΡΠΎΡΠΌΠ°ΡΡ Π΄Π²ΠΎΠΈΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ , ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ Π΄Π»Ρ Π±Π°Π·ΠΎΠ²ΡΡ ΡΠΈΠΏΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, quint16 ΠΈΠ»ΠΈ float) ΠΈΠ»ΠΈ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ readRawBytes() ΠΈ writeRawBytes(). ΠΡΠ»ΠΈ QDataStream ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ Β«ΡΠΈΡΡΡΡ Β» ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ Π‘++, Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ setVersion().
ΠΠΎ ΡΠΈΡ ΠΏΠΎΡ ΠΌΡ Π·Π°Π³ΡΡΠΆΠ°Π»ΠΈ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΠ»ΠΈ Π΄Π°Π½Π½ΡΠ΅, ΠΆΠ΅ΡΡΠΊΠΎ Π·Π°Π΄Π°Π²Π°Ρ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π²Π΅ΡΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° QDataStream::Qt_4_1. ΠΡΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΡΠΎΡΡ, ΠΈ ΠΎΠ½ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π½ΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ ΠΎΠ΄ΠΈΠ½ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ: ΠΌΡ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½ΠΎΠ²ΡΠΌΠΈ ΡΠΎΡΠΌΠ°ΡΠ°ΠΌΠΈ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΌΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ ΡΠΎΡΠΌΠ°ΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π² Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ Qt Π΄ΠΎΠ±Π°Π²ΠΈΡΡΡ Π½ΠΎΠ²ΡΠΉ Π°ΡΡΠΈΠ±ΡΡ ΠΊ QFont (ΠΊΡΠΎΠΌΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠΎΡΠΊΠΈ, Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΈΡΡΠ° ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅) ΠΈ ΠΌΡ ΠΆΠ΅ΡΡΠΊΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌ Π½ΠΎΠΌΠ΅Ρ Π²Π΅ΡΡΠΈΠΈ Qt_4_1, ΡΡΠΎΡ Π°ΡΡΠΈΠ±ΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ ΠΈ Π·Π°Π³ΡΡΠΆΠ°ΡΡΡΡ. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΄Π²Π° ΡΠ΅ΡΠ΅Π½ΠΈΡ. ΠΠ΅ΡΠ²ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π²ΠΎ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ Π½ΠΎΠΌΠ΅ΡΠ° Π²Π΅ΡΡΠΈΠΈ QDataStream Π² ΡΠ°ΠΉΠ»:
QDataStream out(&file);
out << quint32(MagicNumber) << quint16(out.version());
(MagicNumber β ΡΡΠΎ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΡΠ΅Ρ ΡΠΈΠΏ ΡΠ°ΠΉΠ»Π°.) Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅ΠΌ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ QDataStream (ΠΊΠ°ΠΊΠΈΠΌ Π±Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π½ΠΈ Π±ΡΠ»). ΠΡΠΈ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠΈ ΡΠ°ΠΉΠ»Π° ΠΌΡ ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ Π½ΠΎΠΌΠ΅Ρ Π²Π΅ΡΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ°:
01 quint32 magic;
02 quint16 streamVersion;
03 QDataStream in(&file);
04 in >> magic >> streamVersion;
05 if (magic != MagicNumber) {
06 cerr << "File is not recognized by this application" << endl;
07 return false;
08 } else if (streamVersion > in.version()) {
09 cerr << "File is from a more recent version of the application"
10 << endl;
11 return false;
12 }
13 in.setVersion(streamVersion);
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΈΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅, Π΅ΡΠ»ΠΈ Π²Π΅ΡΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΌΠ΅Π½ΡΡΠ΅ ΠΈΠ»ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ Π²Π΅ΡΡΠΈΠ΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π²ΡΠ΄Π°Π΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅.
ΠΡΠ»ΠΈ ΡΠ°ΠΉΠ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΎΡΠΌΠ°Ρ Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΌ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ Π²Π΅ΡΡΠΈΠΈ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π½ΠΎΠΌΠ΅ΡΠ° Π²Π΅ΡΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ°, Π° Π½Π΅ Ρ ΡΠ°Π½ΠΈΡΡ ΡΡΠΎΡ Π½ΠΎΠΌΠ΅Ρ Π² ΡΠ²Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅. ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΡΠ°ΠΉΠ» ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ 1.3 Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π’ΠΎΠ³Π΄Π° ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
QDataStream out(&file);
out.setVersion(QDataStream::Qt_4_1);
out << quint32(MagicNumber) << quint16(0x0103);
ΠΡΠΈ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π²Π΅ΡΡΠΈΡ QDataStream Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π½ΠΎΠΌΠ΅ΡΠ° Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
01 QDataStream in(&file);
02 in >> magic >> appVersion;
03 if (magic != MagicNumber) {
04 cerr << "File is not recognized by this application" << endl;
05 return false;
06 } else if (appVersion > 0x0103) {
07 cerr << "File is from a more recent version of the application"
08 << endl;
09 return false;
10 }
11 if (appVersion < 0x0103) {
12 in.setVersion(QDataStream::Qt_3_0);
13 } else {
14 in.setVersion(QDataStream::Qt_4_1);
15 }
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠΌ, ΡΡΠΎ Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, ΡΠΎΡ ΡΠ°Π½Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ Π²Π΅ΡΡΠΈΠ΅ΠΉ ΠΌΠ΅Π½ΡΡΠ΅ΠΉ, ΡΠ΅ΠΌ 1.3, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²Π΅ΡΡΠΈΡ 4 ΠΏΠΎΡΠΎΠΊΠ° Π΄Π°Π½Π½ΡΡ (Qt_3_0), Π° Π΄Π»Ρ ΡΠ°ΠΉΠ»ΠΎΠ², ΡΠΎΡ ΡΠ°Π½Π΅Π½Π½ΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ Π²Π΅ΡΡΠΈΠ΅ΠΉ 1.3, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²Π΅ΡΡΠΈΡ 7 ΠΏΠΎΡΠΎΠΊΠ° Π΄Π°Π½Π½ΡΡ (Qt_4_1).
ΠΡΠ°ΠΊ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΡΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΡΠ°Π±ΠΎΡΡ Ρ Π²Π΅ΡΡΠΈΡΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π΄Π°Π½Π½ΡΡ QDataStream: ΠΆΠ΅ΡΡΠΊΠΎΠ΅ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° Π²Π΅ΡΡΠΈΠΈ, Π·Π°ΠΏΠΈΡΡ ΠΈ ΡΡΠ΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° Π²Π΅ΡΡΠΈΠΈ Π² ΡΠ²Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΆΠ΅ΡΡΠΊΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π½ΠΎΠΌΠ΅ΡΠΎΠ² Π²Π΅ΡΡΠΈΠΉ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π»ΡΠ±ΡΡ ΠΈΠ· ΡΡΠΈΡ ΠΏΠΎΠ»ΠΈΡΠΈΠΊ Π΄Π»Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π·Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ Π² ΡΡΠ°ΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΠ±ΠΎΡΠΊΠ° Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ²Π΅ΠΆΠ΅ΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ Qt. ΠΠΎΡΠ»Π΅ Π²ΡΠ±ΠΎΡΠ° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²Π΅ΡΡΠΈΠΉ QDataStream ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ Π΄Π²ΠΎΠΈΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ Π² Qt ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ ΠΏΡΠΎΡΡΡΠΌΠΈ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΡΠΌΠΈ.
ΠΡΠ»ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡ Π·Π° ΠΎΠ΄ΠΈΠ½ ΡΠ°Π³, ΠΌΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ QDataStream, Π° Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ write() ΠΈ readAll() ΠΊΠ»Π°ΡΡΠ° QIODevice. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
01 bool copyFile(const QString &source, const QString &dest)
02 {
03 QFile sourceFile(source);
04 if (!sourceFile.open(QIODevice::ReadOnly))
05 return false;
06 QFile destFile(dest);
07 if (!destFile.open(QIODevice::WriteOnly))
08 return false;
09 destFile.write(sourceFile.readAll());
10 return sourceFile.error() == QFile::NoError
11 && destFile.error() == QFile::NoError;
12 }
Π ΡΡΡΠΎΠΊΠ΅, Π³Π΄Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ readAll(), Π²ΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² QByteArray, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ write() Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π² Π²ΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°ΠΉΠ». Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ Π΄Π°Π½Π½ΡΡ Π² QByteArray Π²Π΅Π΄Π΅Ρ ΠΊ Π±ΠΎΠ»ΡΡΠ΅ΠΌΡ ΡΠ°ΡΡ ΠΎΠ΄Ρ ΠΏΠ°ΠΌΡΡΠΈ, ΡΠ΅ΠΌ ΠΏΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΌ ΡΡΠ΅Π½ΠΈΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΎΠ΄Π½Π°ΠΊΠΎ ΡΡΠΎ Π΄Π°Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ qCompress() ΠΈ qUncompress() Π΄Π»Ρ ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ ΠΈ ΡΠ°ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ .
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΡΠΌΠΎΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ QIODevice ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΌ, ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ QDataStream. ΠΠ»Π°ΡΡ QIODevice ΠΈΠΌΠ΅Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ peek(), ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π±Π°ΠΉΡΡ Π΄Π°Π½Π½ΡΡ , ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡ ungetChar(), ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠΈΡΠ°Π½Π½ΡΠΉ Π±Π°ΠΉΡ Π² ΠΏΠΎΡΠΎΠΊ. ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠ°ΠΊ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° (ΡΠ°ΠΊΠΈΡ , ΠΊΠ°ΠΊ ΡΠ°ΠΉΠ»Ρ), ΡΠ°ΠΊ ΠΈ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°Ρ (ΡΠ°ΠΊΠΈΡ , ΠΊΠ°ΠΊ ΡΠ΅ΡΠ΅Π²ΡΠ΅ ΡΠΎΠΊΠ΅ΡΡ). ΠΠΌΠ΅Π΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡ seek(), ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΡΡΡΡΠΎΠΉΡΡΠ², ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ.