Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 70

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

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(), которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для установки ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ устройств, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ доступ.