Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

При успешном открытии файла мы создаем QDataStream и определяем его номер версии. Номер версии — это целое число, влияющее на представление в Qt типов данных (базовые типы данных С++ всегда представляются одинаково). В Qt 4.1 большинство сложных форматов имеют версию 7. Мы можем либо жестко закодировать в программе константу 7, либо использовать символическое имя QDataStream::Qt_4_1.

Чтобы обеспечить представление значения 0x12345678 в виде 32-битового целого числа без знака на всех платформах, мы приводим его тип к quint32 — типу

данных, размер которого всегда равен точно 32 битам. Для обеспечения функциональной совместимости QDataStream по умолчанию использует прямой порядок байтов (big-endian); это можно изменить, вызывая функцию setByteOrder.

Нам не надо явно закрывать файл, поскольку это делается автоматически, когда переменная типа QFile выходит из области видимости. Если необходимо убедиться в том, что данные действительно записаны, мы можем вызвать функцию flush и проверить возвращаемое значение (true при успешном завершении).

Программный код для чтения данных является зеркальным отражением кода, используемого нами для записи данных:

quint32 n;

QImage image;

QMap<QString, QColor> map;

QFile file("facts.dat");

if (!file.open(QIODevice::ReadOnly)) {

cerr << "Cannot open file for reading: "

<< qPrintable(file.errorString) << endl;

return;

}

QDataStream in(&file);

in.setVersion(QDataStream::Qt_4_1);

in >> n >> image >> map;

При чтении используется та же самая версия QDataStream, которую мы использовали при записи. Это условие должно выполняться всегда. Жестко кодируя номер версии, мы гарантируем успешное чтение и запись данных приложением (при условии компиляции приложения с версией Qt 4.1 или более поздней версией Qt).

QDataStream так хранит данные, что мы сможем их считать обратно без особых усилий. Например, QByteArray представляется в виде структуры с 32-битовым счетчиком байтов, за которым идут сами байты. Используя функции readRawBytes и writeRawBytes, QDataStream может также применяться для чтения и записи неформатированных байтов, не имеющих заголовка в виде счетчика байтов.

Обрабатывать ошибки при чтении данных из потока QDataStream достаточно просто. Этот поток данных имеет функцию status, возвращающую значения QDataStream::Ok, QDataStream::ReadPastEnd или QDataStream::ReadCorruptData. При возникновении ошибки оператор >> всегда считывает нулевые или пустые значения. Это означает, что во многих случаях можно просто считывать файл целиком, не беспокоясь о возможных ошибках, и в конце удостовериться в успешном выполнении

чтения, проверив получаемое функцией status значение.

QDataStream работает с разнообразными типами данных С++ и Qt; полный их список доступен в сети Интернет по адресуКроме того, можно добавить поддержку своих собственных пользовательских типов, перегружая операторы << и >>. Ниже приводится определение пользовательского типа данных, которое может быть использовано совместно с 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;

Поделиться:
Популярные книги

Барон играет по своим правилам

Ренгач Евгений
5. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Барон играет по своим правилам

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Герцогиня в ссылке

Нова Юлия
2. Магия стихий
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Герцогиня в ссылке

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Истинная поневоле, или Сирота в Академии Драконов

Найт Алекс
3. Академия Драконов, или Девушки с секретом
Любовные романы:
любовно-фантастические романы
6.37
рейтинг книги
Истинная поневоле, или Сирота в Академии Драконов

Кодекс Охотника. Книга VI

Винокуров Юрий
6. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VI

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Душелов. Том 3

Faded Emory
3. Внутренние демоны
Фантастика:
альтернативная история
аниме
фэнтези
ранобэ
хентай
5.00
рейтинг книги
Душелов. Том 3

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5