Класс QDataStream


Класс QDateStream является гарантом того, что формат, в котором будут записаны данные, останется платформонезависимым и его можно будет считать и обработать на других платформах. Это делает класс незаменимым для обмена данными по сети с использованием сокетных соединений.

Формат данных, используемый QDataStream, в процессе разработки версии Qt претерпел множество изменений и продолжает изменяться. По этой причине этот класс знаком с различными типами версий, и для того чтобы заставить его использовать формат обмена, соответствующий определенной версии Qt, нужно вызвать метод setVersion(), передав ему идентификатор версии. Текущая версия имеет идентификатор Qt_4_2.

Класс поддерживает большое количество типов данных, к которым относятся: QByteArray, QFont, QImage, QMap, QPixmap, QString, QValueList и Variant.

Следующий пример записывает в файл объект точки (QPointF), задающей позицию растрового изображение вместе с объектом растрового изображения (QImage):


QFile file("file.bin");
if(file.open(QIODevice::WriteOnly))
{
    QDataStream stream(&file);
    stream. setVersion(QDataStream::Qt_4_2);
    stream << QPointF(30, 30) << QImage("image.png");
    if(stream.status() != QDataStream::Ok)
    {
        qDebug() << "Ошибка записи";
    }
}
file.close();

Для чтения этих данных из файла нужно сделать следующее:


QPointF pt;
QImage img;
QFile file("file.bin");
if(file.open(QIODevice::ReadOnly))
{
    QDataStream stream(&file);
    stream.setVersion (QDataStream::Qt_4_2) ;
    stream >> pt >> img;
    if(stream.status() != QDataStream::Ok)
    {
        qDebug() << "Ошибка чтения файла";
    }
file.close();
}

Qt имеет абстрактный класс QIODevice, который представляет собой устройство ввода/вывода. Классы, унаследованные от QIODevice, предоставляют возможность записи и чтения данных в файл байтами или блоками. QFile и QBuffer наследуют этот класс.

Класс QFile содержит методы, необходимые для работы с файлами, такие как: открытие, закрытие, чтение и запись.

Класс QBuffer предназначен для эмуляции файлов в оперативной памяти.

Такие файлы хранятся не на диске, а в памяти компьютера, что существенно ускоряет процесс обращения к ним.

Класс QDir предоставляет платформонезависимый подход для работы с директориями. Этот класс содержит методы для создания и уничтожения директорий, а также для получения главной, текущей и персональной директории пользователя.

При помощи класса QFileInfo можно получить всю необходимую информацию о файлах и директориях.

Qt предоставляет классы потоков, которые делают удобной работу с данными файлов: QDataStream для двоичных данных, a QTextStream для текстовых. Использование этих потоков очень похоже на использование обычного потока в языке C++. Как и в стандартных потоках, для чтения и записи перегружены операторы << и >>. Так как потоки принимают объекты, унаследованные от QIODevice-классов, то, вместо объекта класса QFile, данные можно перенаправить в объект класса QBuffer.

Читать далее: Программирование баз данных с помощью Qt